A Classe Object
Parte da seção Programação Orientada a Objetos do Journey de Java da Coddy — lição 24 de 87.
Em Java, cada classe que você cria herda automaticamente de uma classe especial chamada Object. Mesmo que você não escreva extends em lugar nenhum, sua classe ainda é uma filha de Object. Isso torna o Object a raiz de toda a hierarquia de classes.
public class Person {
// Isso estende implicitamente Object
}
// É equivalente a:
public class Person extends Object {
}Como toda classe herda de Object, todo objeto em Java tem acesso a vários métodos integrados. Os mais usados incluem:
| Método | Finalidade |
|---|---|
toString() | Retorna uma representação em string do objeto |
equals(Object obj) | Compara dois objetos quanto à igualdade |
hashCode() | Retorna um valor de código hash para o objeto |
getClass() | Retorna a classe de tempo de execução do objeto |
Por padrão, esses métodos têm implementações genéricas. Por exemplo, toString() retorna o nome da classe seguido pelo endereço de memória do objeto, o que não é muito útil:
Person p = new Person();
System.out.println(p.toString()); // Saída: Person@1a2b3c4dÉ por isso que você frequentemente substituirá esses métodos em suas próprias classes para fornecer um comportamento significativo. Entender que Object é o pai universal ajuda a explicar por que você pode armazenar qualquer objeto em uma variável Object e por que certos métodos estão disponíveis em cada objeto que você cria.
Desafio
FácilVamos explorar como a classe Object serve como o pai universal de todas as classes Java, construindo um sistema simples de inventário de dispositivos que demonstra métodos herdados de Object.
Você criará três arquivos para organizar seu código:
Gadget.java: Crie uma classe que represente um dispositivo eletrônico. Sua classe deve ter:- Campos privados para
name(String) eyear(int) - Um construtor que inicializa ambos os campos
- Métodos getter
getName()egetYear()
- Campos privados para
Smartphone.java: Crie uma subclasse que estenda Gadget e adicione recursos específicos de smartphone:- Um campo privado para
brand(String) - Um construtor que recebe name, year e brand - use
super(name, year)para a parte do pai - Um método
getBrand()que retorna a marca - Sobrescreva o método
toString()para retornar:Smartphone: [brand] [name] ([year])
- Um campo privado para
Main.java: Demonstre a diferença entre os métodos padrão e sobrescritos deObject. Você receberá três entradas: um nome de dispositivo, ano e marca. Crie tanto umGadgetquanto umSmartphoneusando o mesmo nome e ano (além da marca para o smartphone) e, em seguida:- Imprima o nome da classe do gadget usando
getClass().getSimpleName() - Imprima se o
toString()padrão do gadget contém o símbolo "@" (imprimatrueoufalse) - Imprima o smartphone usando seu
toString()sobrescrito
- Imprima o nome da classe do gadget usando
Você receberá três entradas: o nome do gadget/smartphone (String), o ano (int) e a marca (String).
Este desafio mostra por que sobrescrever os métodos de Object é importante - o toString() padrão fornece algo como Gadget@1a2b3c, enquanto sua versão personalizada fornece informações significativas!
Folha de consulta
Em Java, toda classe herda automaticamente da classe Object, tornando-a a raiz de toda a hierarquia de classes:
public class Person {
// Isso estende Object implicitamente
}
// É equivalente a:
public class Person extends Object {
}Todo objeto em Java tem acesso a vários métodos integrados herdados de Object:
| Método | Propósito |
|---|---|
toString() | Retorna uma representação em string do objeto |
equals(Object obj) | Compara dois objetos quanto à igualdade |
hashCode() | Retorna um valor de código hash para o objeto |
getClass() | Retorna a classe de tempo de execução do objeto |
Por padrão, toString() retorna o nome da classe seguido pelo endereço de memória do objeto:
Person p = new Person();
System.out.println(p.toString()); // Saída: Person@1a2b3c4dVocê pode sobrescrever esses métodos em suas próprias classes para fornecer um comportamento significativo. Você pode armazenar qualquer objeto em uma variável Object, já que todas as classes herdam dela.
Experimente você mesmo
import java.util.Scanner;
class Main {
public static void main(String[] args) {
Scanner scanner = new Scanner(System.in);
// Ler as entradas
String name = scanner.nextLine();
int year = scanner.nextInt();
scanner.nextLine(); // consumir a quebra de linha
String brand = scanner.nextLine();
// TODO: Criar um objeto Gadget com name e year
// TODO: Criar um objeto Smartphone com name, year, e brand
// TODO: Imprimir o nome da classe do gadget usando getClass().getSimpleName()
// TODO: Imprimir se o toString() do gadget contém "@" (true ou false)
// TODO: Imprimir o smartphone (usa o toString() sobrescrito)
}
}
Esta lição inclui um quiz rápido. Comece a lição para respondê-lo e acompanhar seu progresso.
Todas as lições de Programação Orientada a Objetos
1Fundamentos de POO
Arquivos ExternosIntrodução à POOClasses vs ObjetosA Palavra-chave thisMétodosCampos (Atributos)Método ConstrutorSobrecarga de ConstrutorRecapitulação - Calculadora Simples4Herança
Herança Básica (extends)A Palavra-chave superSobrescrita de Método (@Override)Encadeamento de ConstrutoresA Classe ObjectHerança Simples e MultinívelPor que não há Herança Múltipla de ClassesRecapitulação - Hierarquia de Funcionários7Métodos Especiais e a Classe Object
Método toString()equals() e hashCode()Método clone()compareTo() e ComparableInterface ComparatorRecapitulação - Ordenação Personalizada2Modificadores de Acesso e Encapsulamento
Visão Geral dos Níveis de AcessoMétodos Getter e SetterOcultação de InformaçõesA Palavra-chave finalRecapitulação - Gerenciador de Conta Bancária5Polimorfismo
Fundamentos de Sobrecarga de MétodosSobrescrita de Métodos (Tempo de Execução)Upcasting e DowncastingO Operador instanceofClasses e Métodos AbstratosRecapitulação - Calculadora de Formas8Conceitos Avançados de OOP
Composição vs HerançaAgregação vs ComposiçãoClasses Internas, Aninhadas e AnônimasEnums e Métodos de EnumRecords (Java 16+)Classes Seladas (Java 17+)11Padrões de Projeto Parte 1
Introdução aos Padrões de ProjetoPadrão SingletonPadrão FactoryPadrão BuilderPadrão ObserverPadrão Strategy3Propriedades de Classe e Membros Estáticos
Variáveis de Instância vs EstáticasMétodos EstáticosBlocos EstáticosConstantes (static final)Recapitulação - Contador e Utilitário6Interfaces e Classes Abstratas
Introdução às InterfacesImplementando InterfacesImplementação de Múltiplas InterfacesDefault e Static em InterfacesClasses Abstratas vs InterfacesInterfaces FuncionaisRecapitulação - Sistema de Pagamento9Generics
Introdução a GenericsClasses GenéricasMétodos GenéricosParâmetros de Tipos DelimitadosWildcards (?, extends, super)Recapitulação - Container Genérico12Padrões de Projeto Parte 2
Padrão CommandPadrão AdapterPadrão DecoratorPadrão Template MethodPadrão StatePadrão CompositePadrão Iterator