Clase Object Java. Método toString. Método equals.

La clase Object es la clase base del árbol de jerarquía de clases de Java.
Todas las clases Java heredan directa o indirectamente de la clase Object.
Esta clase define el comportamiento básico que todos los objetos deben tener. Para ello proporciona una serie de métodos que son heredados y por lo tanto están disponibles en todas las clases Java.
De todos los métodos que se heredan de Object en esta entrada vamos a ver los métodos toString y equals

Método toString()

public String toString(){
       ......
}
El método toString() devuelve un String que representa el objeto. El contenido de este String depende del objeto sobre el que se esté aplicando.
El método toString() se invoca de forma automática cuando se nuestra un objeto mediante la instrucción System.out.println o System.out.print
Esto quiere decir que las siguientes instrucciones son equivalentes:
System.out.println(unObjeto.toString());
System.out.println(unObjeto);
Ejemplo de uso del método toString()
Disponemos de la siguiente clase llamada Coordenadas
package tostring1;
public class Coordenadas {
    private double x;
    private double y;

    public Coordenadas() {
    }
    public Coordenadas(double x, double y) {                                                                      
        this.x = x;
        this.y = y;
    }
    public double getX() {
        return x;
    }
    public void setX(double x) {
        this.x = x;
    }
    public double getY() {
        return y;
    }
    public void setY(double y) {                                                                                  
        this.y = y;
    }
}
Un programa que utilice esta clase podría ser este:
package tostring1;
public class ToString1 {
    public static void main(String[] args) {                                                                      
        Coordenadas punto1 = new Coordenadas(6.8,15.22);                                                          
        System.out.println(punto1);
    }
}
Se ha creado un objeto punto1 y se quiere mostrar por pantalla mediante la instrucción
System.out.println(punto1);
Como la clase Coordenadas no contiene un método toString(), la instrucción System.out.println(punto1); invocará al método toString() heredado de Object y mostrará el String que devuelve dicho método.
En este caso se mostrará por pantalla algo similar a esto:
tostring1.Coordenadas@4a5ab2
Vemos que el String que ha devuelto el método toString() heredado de Object contiene el nombre del package seguido del nombre de la Clase y de un número.
Como esto normalmente no es lo que queremos que aparezca cuando se muestra el contenido de un objeto, el métod toString() lo podemos redefinir o sobrescribir (override) para representar nuestros objetos de forma más adecuada.
Cuando se sobrescribe un método heredado hay que mantener el prototipo o encabezado del método tal cual se hereda. Si se escribe el método de forma distinta (por ejemplo, añadiendo un parámetro) estaremos sobrecargando el método, no sobrescribiéndolo.
En este caso lo vamos a modificar para que muestre el valor de las coordenadas de modo que cuando escribamos la instrucción:
System.out.println(punto1);
Se muestre por ejemplo:
Coordenadas: x = 6.8 y = 15.22

Para esto tenemos que escribir el método toString() dentro de la clase de la siguiente forma:

@Override
public String toString() {                                                                                        
         return "Coordenadas: " + "x = " + x + " y = " + y;                                                       
}

La anotación:

@Override

Es necesario escribirla antes del método e indica que estamos modificando el método toString() heredado de Object.

Después de añadir el método a la clase, la instrucción:

System.out.println(punto1);

Mostrará por pantalla:

Coordenadas: x = 6.8 y = 15.22

Método equals()

public boolean equals( Object obj ){
    .......
}
Este método compara dos objetos para ver si son o no iguales.
Para determinar si son o no iguales, el método equals comprueba si los objetos pertenecen a la misma clase y contienen los mismos datos. Devuelve true si los objetos son iguales y false si no lo son.
Comparar dos objetos con equals es distinto a hacerlo con el operador ==.
Este operador == compara si dos referencias a objetos apuntan al mismo objeto.
Igual que ocurre con el método toString() en una clase podemos sobrescribir el método equals() para adaptarlo a nuestras necesidades.
Mediante la Opción Insertar Código de los entornos de desarrollo como NetBeans o Eclipse (Fuente -> Insertar Código en NetBeans) podemos añadir a nuestras clases el código de estos métodos heredados de Object.
El método equals que genera NetBeans de forma automática para la clase Coordenadas es este:
@Override
public boolean equals(Object obj) {                                                                               
        if (obj == null) {
            return false;
        }
        if (getClass() != obj.getClass()) {
            return false;
        }
        final Coordenadas other = (Coordenadas) obj;
        if (Double.doubleToLongBits(this.x) != Double.doubleToLongBits(other.x)) {
            return false;
        }
        if (Double.doubleToLongBits(this.y) != Double.doubleToLongBits(other.y)) {                                
            return false;
        }
        return true;
}
En este caso este método equals nos sirve para realizar de forma corracta la comparación entre objetos de la clase Coordenadas y no hay que hacer ninguna modificación.
Vemos que lo primero que se comprueba es que se reciba un objeto para compararlo con el que llama al método, o sea, si el parámetro obj es igual a null significa que no apunta a ningún objeto y por lo tanto la comparación es falsa.
Lo siguiente es comprobar   que ambos objetos son de la misma clase. La clase a la que pertenece un objeto la podemos obtener mediante el método getClass(). Si no lo son la comparación es falsa.
Por último nos queda comprobar los atributos de cada objeto para ver si contienen los mismos valores. Para ello el objeto que se recibe como parámetro se convierte a objeto de la clase Coordenadas y se comparan los atributos x e y de ambos.
Un ejemplo de uso del método equals podría ser este:
package tostring1;
public class ToString1 {
    public static void main(String[] args) {
        Coordenadas punto1 = new Coordenadas(6.8, 15.22);                                                         
        Coordenadas punto2 = new Coordenadas(6.8, 10.12);
        if(punto1.equals(punto2)){
            System.out.println("Coordenadas iguales");
        }else{
            System.out.println("Coordenadas distintas");                                                          
        }
       
    }
}
En este caso se mostrará el mensaje Coordenadas distintasya que la coordenada y es diferente en ambos objetos y por tanto comparación dentro del método equals de la coordenada y dará como resultado que el método devuelva false.

2 comentarios:

  1. es poco complejo de entender el metodo equals

    ResponderEliminar
  2. Hola buenas tardes mi profesor de poo, nos prohibió usar el getClass o el instanceof , hay otra forma de hacerlo?

    ResponderEliminar