Classes e objetos são conceitos básicos de Programação Orientada a Objetos que giram em torno de entidades da vida real.

Classe

Uma classe é um projeto ou protótipo definido pelo usuário a partir do qual os objetos são criados. Ele representa o conjunto de propriedades ou métodos comuns a todos os objetos de um tipo. Em geral, as declarações de classe podem incluir esses componentes, na ordem: 

  1. Modificadores : uma classe pode ser pública ou ter acesso padrão (consulte isto para obter detalhes).
  2. palavra-chave da classe: a palavra-chave da classe é usada para criar uma classe.
  3. Nome da classe:  o nome deve começar com uma letra inicial (maiúscula por convenção).
  4. Superclasse (se houver): O nome do pai da classe (superclasse), se houver, precedido pela palavra-chave extends. Uma classe só pode estender (subclasse) um pai.
  5. Interfaces (se houver): uma lista separada por vírgulas de interfaces implementadas pela classe, se houver, precedida pela palavra-chave implements. Uma classe pode implementar mais de uma interface.
  6. Corpo: o corpo da classe entre colchetes, {}.

Construtores são usados ​​para inicializar novos objetos. Os campos são variáveis ​​que fornecem o estado da classe e seus objetos, e métodos são usados ​​para implementar o comportamento da classe e seus objetos.
Existem vários tipos de classes que são usados ​​em aplicativos de tempo real, como  classes aninhadas , classes anônimas , expressões lambda

Objeto

É uma unidade básica de Programação Orientada a Objetos e representa as entidades da vida real. Um programa Java típico cria muitos objetos que, como você sabe, interagem invocando métodos. Um objeto consiste em: 

  1. Estado : é representado pelos atributos de um objeto. Ele também reflete as propriedades de um objeto.
  2. Comportamento : é representado por métodos de um objeto. Ele também reflete a resposta de um objeto com outros objetos.
  3. Identidade : dá um nome único a um objeto e permite que um objeto interaja com outros objetos.

Exemplo de um objeto: cachorro

Diagrama em branco - Página 1 (5)

Os objetos correspondem a coisas encontradas no mundo real. Por exemplo, um programa gráfico pode ter objetos como “círculo”, “quadrado”, “menu”. Um sistema de compras online pode ter objetos como “carrinho de compras”, “cliente” e “produto”. 
 

Declarando objetos (também chamado de instanciar uma classe)

Quando um objeto de uma classe é criado, diz-se que a classe está instanciada . Todas as instâncias compartilham os atributos e o comportamento da classe. Mas os valores desses atributos, ou seja, o estado são únicos para cada objeto. Uma única classe pode ter qualquer número de instâncias.

Exemplo: 

Diagrama em branco - Página 1 (3)

Conforme declaramos variáveis ​​como (nome do tipo;). Isso notifica o compilador de que usaremos o nome para se referir aos dados cujo tipo é tipo. Com uma variável primitiva, essa declaração também reserva a quantidade adequada de memória para a variável. Portanto, para a variável de referência, o tipo deve ser estritamente um nome de classe concreto. Em geral, não podemos criar objetos de uma classe abstrata ou de uma interface.  

Dog tuffy;

Se declararmos a variável de referência (tuffy) assim, seu valor será indeterminado (nulo) até que um objeto seja realmente criado e atribuído a ela. A simples declaração de uma variável de referência não cria um objeto.
 

Inicializando um objeto

O novo operador instancia uma classe alocando memória para um novo objeto e retornando uma referência a essa memória. O novo operador também invoca o construtor da classe. 

// Class Declaration
 
public class Dog
{
    // Instance Variables
    String name;
    String breed;
    int age;
    String color;
 
    // Constructor Declaration of Class
    public Dog(String name, String breed,
                   int age, String color)
    {
        this.name = name;
        this.breed = breed;
        this.age = age;
        this.color = color;
    }
 
    // method 1
    public String getName()
    {
        return name;
    }
 
    // method 2
    public String getBreed()
    {
        return breed;
    }
 
    // method 3
    public int getAge()
    {
        return age;
    }
 
    // method 4
    public String getColor()
    {
        return color;
    }
 
    @Override
    public String toString()
    {
        return("Hi my name is "+ this.getName()+
               ".\nMy breed,age and color are " +
               this.getBreed()+"," + this.getAge()+
               ","+ this.getColor());
    }
 
    public static void main(String[] args)
    {
        Dog tuffy = new Dog("tuffy","papillon", 5, "white");
        System.out.println(tuffy.toString());
    }
}

Saída: 

Hi my name is tuffy.
My breed,age and color are papillon,5,white
  • Esta classe contém um único construtor. Podemos reconhecer um construtor porque sua declaração usa o mesmo nome da classe e não tem tipo de retorno. O compilador Java diferencia os construtores com base no número e no tipo dos argumentos. O construtor da classe Dog aceita quatro argumentos. A declaração a seguir fornece "tuffy", "papillon", 5, "white" como valores para esses argumentos:
Dog tuffy = new Dog("tuffy","papillon",5, "white");
  • O resultado da execução desta instrução pode ser ilustrado como:

Sem título

Observação: todas as classes têm pelo menos um construtor. Se uma classe não declara nenhum explicitamente, o compilador Java fornece automaticamente um construtor sem argumento, também chamado de construtor padrão. Este construtor padrão chama o construtor sem argumento do pai da classe (pois contém apenas uma instrução, ou seja, super();), ou o construtor da classe Object se a classe não tiver outro pai (já que a classe Object é pai de todas as classes direta ou indiretamente ) 

Maneiras de criar objeto de uma classe

Existem quatro maneiras de criar objetos em java. Estritamente falando, há apenas uma maneira (usando a nova palavra-chave) e o restante usa internamente a nova palavra-chave. 

  • Usando nova palavra-chave: É a forma mais comum e geral de criar objetos em java. Exemplo:
// creating object of class Test
Test t = new Test();
  • Usando o método Class.forName (String className): Há uma classe predefinida no pacote java.lang com o nome Class. O método forName (String className) retorna o objeto Class associado à classe com o nome de string fornecido. Precisamos fornecer o nome totalmente qualificado de uma classe. Ao chamar o novo método Instance() neste objeto Class, retorna uma nova instância da classe com o nome de string fornecido.
// creating object of public class Test
// consider class Test present in com.p1 package
Test obj = (Test)Class.forName("com.p1.Test").newInstance();
  • Usando o método clone(): o método clone() está presente na classe Object. Ele cria e retorna uma cópia do objeto.
        
// creating object of class Test
Test t1 = new Test();

// creating clone of above object
Test t2 = (Test)t1.clone();
            
FileInputStream file = new FileInputStream(filename);
ObjectInputStream in = new ObjectInputStream(file);
Object obj = in.readObject();

Criação de vários objetos por apenas um tipo (uma boa prática) 

  • Em tempo real, precisamos de diferentes objetos de uma classe em diferentes métodos. Criar várias referências para armazená-las não é uma boa prática e, portanto, declaramos uma variável de referência estática e a usamos sempre que necessário. Nesse caso, o desperdício de memória é menor. Os objetos que não são mais referenciados serão destruídos pelo Garbage Collector de java. Exemplo:
          
Test test = new Test();
test = new Test();
  • No sistema de herança, usamos a variável de referência da classe pai para armazenar um objeto de subclasse. Nesse caso, podemos alternar para diferentes objetos de subclasse usando a mesma variável referenciada. Exemplo:
class Animal {}

class Dog extends Animal {}
class Cat extends Animal {}

public class Test
{
    // using Dog object
    Animal obj = new Dog();

    // using Cat object
    obj = new Cat();
}       

Objetos anônimos

Objetos anônimos são os objetos instanciados, mas não armazenados em uma variável de referência.  

  • Eles são usados ​​para chamada de método imediata.
  • Eles serão destruídos após a chamada do método.
  • Eles são amplamente utilizados em diferentes bibliotecas. Por exemplo, em bibliotecas AWT, eles são usados ​​para realizar alguma ação na captura de um evento (por exemplo, um pressionamento de tecla).
  • No exemplo abaixo, quando uma tecla é um botão (referido por btn) é pressionado, estamos simplesmente criando um objeto anônimo da classe EventHandler apenas para chamar o método de manipulação.
btn.setOnAction(new EventHandler()
{
    public void handle(ActionEvent event)
    {
        System.out.println("Hello World!");
    }
});

Este artigo é uma contribuição de Gaurav Miglani . Se você gosta de GeeksforGeeks e gostaria de contribuir, você também pode escrever um artigo usando write.geeksforgeeks.org ou enviar seu artigo para review-team@geeksforgeeks.org. Veja o seu artigo na página principal do GeeksforGeeks e ajude outros Geeks.
Escreva comentários se encontrar algo incorreto ou se quiser compartilhar mais informações sobre o tópico discutido acima.