La clase Object es la superclase de todas las clases en Java. Aunque no se declara explícitamente, todas las clases heredan automáticamente de Object. Algunos de los métodos más importantes incluidos son: toString(), getClass(), equals(), clone(), y finalize().
1. Método clone()
El método clone() permite crear una copia de un objeto existente. Para utilizarlo, la clase debe implementar la interfaz Cloneable. Este proceso difiere de simplemente asignar un objeto a otra variable, ya que en este caso ambas variables apuntarían al mismo espacio en memoria.
Ejemplo:
package com.ejemplo.clonacion;
public class Persona implements Cloneable {
private String nombre;
private int edad;
public Persona(String nombre, int edad) {
this.nombre = nombre;
this.edad = edad;
}
@Override
protected Object clone() throws CloneNotSupportedException {
return super.clone();
}
}
public class PruebaClonacion {
public static void main(String[] args) throws CloneNotSupportedException {
Persona personaOriginal = new Persona("Ana", 30);
Persona personaClonada = (Persona) personaOriginal.clone();
System.out.println(personaOriginal); // Salida: com.ejemplo.clonacion.Persona@...
System.out.println(personaClonada); // Salida: com.ejemplo.clonacion.Persona@... (diferente)
}
}
Diferencia entre clone() y copia directa
Cuando se realiza una simple asignación, como Persona p2 = p1;, ambas variables apuntan al mismo objeto. Sin embargo, con clone(), se crea un nuevo objeto independiente.
Clonación superficial vs profunda
- Clonación superficial: Copia solo los valores primitivos y referencias de objetos. Las referencias dentro del objeto clonado apuntan a los mismos objetos que el original.
- Clonación profunda: Crea copias completas de todos los objetos anidados, asegurando que los objetos clonados sean completamente independientes.
Para realizar una clonación profunda, puede utilizarse serialización o implementar manualmente la lógica en el método clone().
2. Método toString()
Este método devuelve una representación en cadena del objeto. Por defecto, retorna el nombre de la clase seguido de "@" y la representación hexadecimal del código hash del objeto.
Ejemplo:
public class EjemploToString {
public static void main(String[] args) {
Object obj = new Object();
System.out.println(obj.toString()); // Salida: java.lang.Object@hash
}
}
Se recomienda sobrescribir este método para proporcionar información más significativa sobre el estado del objeto.
3. Método getClass()
Devuelve la instancia de Class que representa la clase en tiempo de ejecución del objeto.
Ejemplo:
public class EjemploGetClass {
public static void main(String[] args) {
Object obj = new Object();
System.out.println(obj.getClass().getName()); // Salida: java.lang.Object
}
}
4. Método finalize()
Permite realizar acciones de lipmieza justo antes de que el recolectro de basura libere el objeto. Sin embargo, su uso está desalentado debido a su incertidumbre en cuanto a cuándo será llamado.
5. Método equals()
Compara si dos objetos son iguales. Por defecto, compara las referencias de memoria. En muchas clases, como String, este método es redefinido para comparar el contenido.
Ejemplo:
public class EjemploEquals {
public static void main(String[] args) {
String str1 = "Hola";
String str2 = "Hola";
System.out.println(str1.equals(str2)); // Salida: true
}
}
6. Método hashCode()
Devuelve un valor hash único para el objeto. Si dos objetos son iguales según equals(), sus códigos hash deben ser iguales.
7. Métodos wait(), notify() y notifyAll()
Estos métodos se utilizan para la sincronización de hilos. wait() pausa el hilo actual hasta que otro hilo llame a notify() o notifyAll().
Ejemplo básico de uso:
public class EjemploSincronizacion {
public static void main(String[] args) {
Object bloqueo = new Object();
new Thread(() -> {
synchronized (bloqueo) {
try {
System.out.println("Esperando...");
bloqueo.wait();
} catch (InterruptedException e) {
e.printStackTrace();
}
System.out.println("Notificado!");
}
}).start();
new Thread(() -> {
synchronized (bloqueo) {
System.out.println("Notificando...");
bloqueo.notify();
}
}).start();
}
}