Saltar al contenido principal

Clase Object

La clase Object del paquete java.lang es una clase especial de la que heredan, directa o indirectamente, todas las clases en Java.

Todas las clases descienden de Object. Incluso las que nosotros definimos heredan de Object. Esta herencia se realiza por defecto si no se especifica nada:

public class Persona {
// ...
}

En realidad es lo mismo que:

public class Persona extends Object {
// ...
}

Por lo tanto:

  • Todas las clases implementan un conjunto de métodos definidos en la clase Object.
  • Se puede hacer referencia de cualquier tipo utilizando un objeto Object.

Método toString

El método toString() devuelve una cadena que representa el objeto. Su prototipo es el siguiente:

public String toString();

La implementación en la clase Object consiste en devolver el nombre cualificado de la clase a la que pertenece el objeto, seguido de @ y la referencia del objeto. Ejemplo:

"paquete.Persona@2a139a55"

Esta implementación por defecto no es útil para la mayoría de los objetos, por lo tanto deberíamos realizar una redefinición del método en cada clase que programemos. Cada clase puede utilizar una forma diferente de representarse.

public class Persona {
//...

@Override
public String toString() {
return "Persona: " + this.nombre;
}
}

Método equals

El método equals(Object) compara dos objetos y decide si son iguales, devolviendo true en caso afirmativo y false en caso contrario. Es importante destacar que el operador == es válido para comparar tipos primitivos, pero no sirve para comparar objetos, ya que solo examina sus referencias sin fijarse en el contenido:

Persona a = new Persona("Jose", 8, 1.74);
Persona b = new Persona("Jose", 8, 1.74);
a == b // Esto es falso

Los dos objetos ocupan lugares distintos de memoria, por eso la referencia no es igual.

Vamos a implementar equals(Object) para la clase Persona. Tenemos que decidir qué significa que dos personas sean iguales. Por ejemplo, consideramos en este caso que solo son iguales si tienen el mismo nombre y edad:

@Override
public boolean equals(Object otraPersona) {
Persona otra = (Persona) otraPersona; // necesitamos realizar un cast
if(this.nombre.equals(otra.getNombre()) && this.edad == otra.getEdad()) {
return true;
}
return false;
}

La mayoría de clases de la API tienen su propia implementación de equals(Object).

Método clone

Este método crea una copia superficial (shallow copy) del objeto. El método clone clone() está definido como protected en Object, por lo que solo se puede usar en clases que implementen la interfaz Cloneable.

La copia superficial significa que los objetos contenidos no se copian. En su lugar, se copia la referencia a los objetos.

Para copiar un objeto de forma completa, se debe realizar una copia profunda (deep copy).

Método getClass

Este método devuelve un objeto de la clase Class que representa la clase a la que pertenece el objeto. Es útil para obtener información sobre el tipo de clase del objeto en tiempo de ejecución.