Guía de programación en Java > Object
Introducción
En Java, todas las clases heredan de una clase base llamada Object. Esta clase es la raíz de la jerarquía de clases en Java. Object proporciona métodos esenciales que todas las clases heredan automáticamente. Comprender cómo funciona Object y cómo sobrescribir sus métodos de manera adecuada es fundamental para escribir código robusto y reutilizable.
Características de la Clase Object
- Raíz de la jerarquía: Todas las clases heredan de Object, directa o indirectamente.
- Métodos comunes: Proporciona métodos útiles como
toString()
,equals()
,hashCode()
, entre otros. - Facilita el polimorfismo: Un objeto de cualquier clase puede ser tratado como un objeto de tipo Object.
Métodos Principales de la Clase Object
1. toString()
Propósito
Devuelve una representación en forma de cadena (String
) del objeto. El valor predeterminado es el nombre de la clase seguido de un código hash.
Ejemplo sin sobrescribir:
class Persona {
String nombre;
int edad;
Persona(String nombre, int edad) {
this.nombre = nombre;
this.edad = edad;
}
}
public class Main {
public static void main(String[] args) {
Persona persona = new Persona("Ana", 25);
System.out.println(persona.toString());
}
}
Salida:
Persona@15db9742
Ejemplo sobrescribiendo toString()
:
class Persona {
String nombre;
int edad;
Persona(String nombre, int edad) {
this.nombre = nombre;
this.edad = edad;
}
@Override
public String toString() {
return "Nombre: " + nombre + ", Edad: " + edad;
}
}
public class Main {
public static void main(String[] args) {
Persona persona = new Persona("Ana", 25);
System.out.println(persona.toString());
}
}
Salida:
Nombre: Ana, Edad: 25
Buenas Prácticas:
- Siempre sobrescribe
toString()
para facilitar la depuración y el registro. - Incluye información relevante del objeto.
2. equals(Object obj)
Propósito
Compara si dos objetos son «iguales». El método por defecto compara referencias de memoria.
Ejemplo sin sobrescribir:
class Persona {
String nombre;
int edad;
Persona(String nombre, int edad) {
this.nombre = nombre;
this.edad = edad;
}
}
public class Main {
public static void main(String[] args) {
Persona persona1 = new Persona("Ana", 25);
Persona persona2 = new Persona("Ana", 25);
System.out.println(persona1.equals(persona2));
}
}
Salida:
false
Ejemplo sobrescribiendo equals()
:
class Persona {
String nombre;
int edad;
Persona(String nombre, int edad) {
this.nombre = nombre;
this.edad = edad;
}
@Override
public boolean equals(Object obj) {
if (this == obj) return true;
if (obj == null || getClass() != obj.getClass()) return false;
Persona persona = (Persona) obj;
return edad == persona.edad && nombre.equals(persona.nombre);
}
}
public class Main {
public static void main(String[] args) {
Persona persona1 = new Persona("Ana", 25);
Persona persona2 = new Persona("Ana", 25);
System.out.println(persona1.equals(persona2));
}
}
Salida:
true
Buenas Prácticas:
- Compara atributos relevantes del objeto.
- Usa la anotación
@Override
para evitar errores tipográficos.
3. hashCode()
Propósito
Devuelve un valor entero que representa el código hash del objeto. Es esencial para el correcto funcionamiento de estructuras como HashMap
y HashSet
.
Ejemplo sin sobrescribir:
class Persona {
String nombre;
int edad;
Persona(String nombre, int edad) {
this.nombre = nombre;
this.edad = edad;
}
}
public class Main {
public static void main(String[] args) {
Persona persona = new Persona("Ana", 25);
System.out.println(persona.hashCode());
}
}
Salida (varía en cada ejecución):
356573597
Ejemplo sobrescribiendo hashCode()
:
class Persona {
String nombre;
int edad;
Persona(String nombre, int edad) {
this.nombre = nombre;
this.edad = edad;
}
@Override
public int hashCode() {
return nombre.hashCode() + edad;
}
}
public class Main {
public static void main(String[] args) {
Persona persona = new Persona("Ana", 25);
System.out.println(persona.hashCode());
}
}
Salida:
66773
Buenas Prácticas:
- Usa atributos relevantes para calcular el código hash.
- Si sobrescribes
equals()
, también sobrescribehashCode()
.
4. clone()
Propósito
Crea una copia exacta del objeto. Se utiliza con el patrón prototipo.
Ejemplo sobrescribiendo clone()
:
class Persona implements Cloneable {
String nombre;
int edad;
Persona(String nombre, int edad) {
this.nombre = nombre;
this.edad = edad;
}
@Override
protected Object clone() throws CloneNotSupportedException {
return super.clone();
}
}
public class Main {
public static void main(String[] args) throws CloneNotSupportedException {
Persona persona1 = new Persona("Ana", 25);
Persona persona2 = (Persona) persona1.clone();
System.out.println(persona1.nombre + " - " + persona1.edad);
System.out.println(persona2.nombre + " - " + persona2.edad);
}
}
Salida:
Ana - 25
Ana - 25
Resumen
- La clase Object proporciona métodos fundamentales para la gestión de objetos.
- Sobrescribir estos métodos mejora la funcionalidad y la claridad del código.
- Siguiendo buenas prácticas, se garantiza que el código sea eficiente y más comprensible.
Ejercicio Propuesto
- Crea una clase
Producto
con los atributosnombre
(String) yprecio
(double). - Sobrescribe los métodos
toString()
,equals()
yhashCode()
. - En una clase
Main
, crea varios objetosProducto
y prueba los métodos sobrescritos.
Salida esperada:
Producto: Pan - 1.5
true
23456789
Practica con estos conceptos para dominar la clase Object y sus métodos esenciales. ¡Tú puedes! 🚀
Deja una respuesta