La clase OBJECT

La clase Object es la raíz de todas las clases en el lenguaje Java. Si se declara una clase sin cláusula extends, el compilador agrega automáticamente el código extends Object a la declaración, por ejemplo:

Esto permite sobrescribir varios métodos heredados de la clase Object. A continuación se describen dos métodos importantes de Object.

Veamos algunos de los más  utilizados como equals y toString con más detalle.

EL METODO EQUALS

El operador == realiza una comparación para determinar la equivalencia de dos términos. Es decir, para dos valores de referencia x e y dados, x==y devuelve true si, y sólo si, x e y se refieren al mismo objeto. La clase Object del paquete java.lang contiene el método public boolean equals(Object obj), que compara dos objetos para comprobar su igualdad. Si no se sobrescribe, el método equals() de un objeto devuelve true únicamente si las dos referencias comparadas se refieren al mismo objeto. No obstante, la intención de equals() es comparar el contenido de dos objetos siempre que es posible. Ésta es la razón por la que se sobrescribe con frecuencia. Por ejemplo, el método equals() en la clase String devuelve true únicamente si el argumento no es null y es un objeto String que representa la misma secuencia de caracteres que el objeto String con el que se ha llamado al método. En conclusión, el operador == compara si dos variables contienen la misma referencia mientras que con el método equals podemos comparar las propiedades del objeto para verificar si son iguales o no. Se debería sobrescribir el método hashCode cada vez que sobrescriba equals. Una implementación sencilla podría usar un XOR de bits en los códigos hash de los elementos cuya equivalencia se quiera comprobar. En el siguiente ejemplo, la clase MyDate sobrescribe el método equals que compara los atributos de año, mes y día.

También sobrescribimos el método hashCode implementa un XOR de bits de los atributos de fecha. Esto hace que el código hash de los objetos iguales de MyDate tenga el mismo valor y ofrece la posibilidad de que fechas diferentes devuelvan valores diferentes.

El programa siguiente compara dos objetos MyDate que no son idénticos pero son iguales en cuanto a la comparación de año-mes-día.

En la primera comparación con el operador == se compara si los dos objetos tienen la misma referencia. En la segunda comparación con el método equals, se compara si los dos objetos son iguales, si tienen el mismo día, mes y año. Después asignamos el objeto date1 a date2 y procedemos a una nueva comparación de las referencias de los objetos. La ejecución de este programa de comparación genera la salida siguiente:

 

EL MÉTODO TOSTRING

El método toString convierte un objeto en una representación de cadena o String. El compilador hace referencia a él cuando se produce una conversión automática de cadenas. Por ejemplo, la llamada System.out.println():

La clase Object define un método toString que devuelve el nombre de la clase y su dirección de referencia (normalmente de escasa utilidad). Muchas clases sobrescriben toString para proporcionar información de mayor utilidad. En el siguiente ejemplo creamos la clase Fecha sin sobreescribir el método toString.

En la clase principal, creamos una instancia de Fecha e imprimimos el objeto creado.

Al ejecutar la clase vemos como se imprime el objeto fecha. Es una representación que no nos aporta ninguna información de utilidad, sólo se muestra el paquete, el nombre de la clase y el código del objeto.

A continuación creamos la clase FechaConToString donde sobrescribimos el método toString para obtener una representación textual del objeto.

Al generar la instancia de esta última clase e imprimirlo, vemos que esta vez muestra la representación textual del objeto, aportándonos una mayor información.