Classe Object e seus métodos em Java
Em Java, mesmo que você crie uma classe sem indicar um pai explícito, ela sempre herdará, de forma implícita, de java.lang.Object
. Isso significa que todas as classes, inclusive as que você cria no seu projeto, possuem os métodos definidos na classe Object
.
Entre eles, destacam-se: toString()
, hashCode()
, getClass()
e equals()
.
1. Método toString()
O método toString()
retorna uma representação em formato de texto do objeto.
Por padrão, ele exibe o nome completo da classe seguido de um identificador numérico (hash) hexadecimal.
Exemplo:
public class Program {
public static void main(String[] args) {
Person tom = new Person("Tom");
System.out.println(tom.toString()); // Ex.: Person@7960847b
}
}
class Person {
private String name;
public Person(String name) {
this.name = name;
}
}
A saída padrão dificilmente é útil para descrever o objeto, por isso é comum sobrescrever o método para exibir informações mais legíveis:
class Person {
private String name;
public Person(String name) {
this.name = name;
}
@Override
public String toString() {
return "Person " + name;
}
}
Agora:
Person tom = new Person("Tom");
System.out.println(tom.toString()); // Person Tom
2. Método hashCode()
O método hashCode()
retorna um número inteiro que funciona como uma "assinatura numérica" do objeto.
Ele é usado internamente por estruturas como HashMap
e HashSet
para otimizar buscas.
Exemplo com valor padrão:
Person tom = new Person("Tom");
System.out.println(tom.hashCode()); // Ex.: 2036368507
Você pode sobrescrever para criar sua própria lógica de cálculo:
@Override
public int hashCode() {
return 10 * name.hashCode() + 20456;
}
3. Método getClass()
O método getClass()
retorna o tipo (classe) do objeto em tempo de execução.
Person tom = new Person("Tom");
System.out.println(tom.getClass()); // class Person
Segue a reescrita completa da parte sobre equals
, já incluindo a explicação do comportamento padrão e o motivo para sobrescrevê-lo:
4. Método equals
O método equals(Object obj)
é usado para comparar dois objetos e verificar se eles são considerados iguais.
Comportamento padrão
Por padrão, a implementação de equals()
na classe Object
compara apenas as referências dos objetos, ou seja, verifica se as duas variáveis apontam para o mesmo endereço de memória. Isso significa que, mesmo que dois objetos tenham exatamente os mesmos valores nos atributos, equals()
retornará false
se eles não forem o mesmo objeto.
Exemplo:
public class Program {
public static void main(String[] args) {
Person p1 = new Person("Tom");
Person p2 = new Person("Tom");
Person p3 = p1;
System.out.println(p1.equals(p2)); // false - equals padrão
System.out.println(p1 == p2); // false - também compara referências
System.out.println(p1 == p3); // true - p3 é a mesma referência que p1
}
}
class Person {
String name;
Person(String name) {
this.name = name;
}
}
Nesse caso, embora p1
e p2
tenham o mesmo valor para o campo name
, o resultado é false
porque são dois objetos diferentes na memória.
Sobrescrevendo equals
Em muitos cenários, queremos que dois objetos sejam considerados iguais quando seus valores são iguais, independentemente de serem instâncias diferentes. Para isso, precisamos sobrescrever o método equals()
e implementar nossa própria lógica de comparação.
Exemplo:
public class Program {
public static void main(String[] args) {
Person tom = new Person("Tom");
Person bob = new Person("Bob");
System.out.println(tom.equals(bob)); // false
Person tom2 = new Person("Tom");
System.out.println(tom.equals(tom2)); // true
}
}
class Person {
private String name;
public Person(String name) {
this.name = name;
}
@Override
public boolean equals(Object obj) {
if (!(obj instanceof Person)) return false;
Person p = (Person) obj;
return this.name.equals(p.name);
}
}
Nesse exemplo, a sobrescrita permite que dois objetos Person
com o mesmo valor de name
sejam considerados iguais, mesmo que sejam instâncias diferentes.
Resumo
toString()
— Representa o objeto como texto (idealmente sobrescrever para algo legível).hashCode()
— Retorna um inteiro usado como identificador numérico em estruturas de dados.getClass()
— Retorna o tipo de classe do objeto.equals()
— Compara dois objetos para verificar igualdade lógica.
Esses métodos são fundamentais para personalizar como objetos se comportam em coleções, impressões no console e comparações.