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:
|
1 2 3 4 5 6 7 8 9 10 11 |
public class Alumno{ // Código de mi clase } // ES LO MISMO QUE: public class Alumno extends Objetc{ // Código de mi clase } |
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.
|
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 |
package app.ejemplo; public class MyDate { private int dia; private int mes; private int anyo; public MyDate() { // TODO Auto-generated constructor stub } public MyDate(int dia, int mes, int anyo) { super(); this.dia = dia; this.mes = mes; this.anyo = anyo; } public int getDia() { return dia; } public void setDia(int dia) { this.dia = dia; } public int getMes() { return mes; } public void setMes(int mes) { this.mes = mes; } public int getAnyo() { return anyo; } public void setAnyo(int anyo) { this.anyo = anyo; } @Override public int hashCode() { final int prime = 31; int result = 1; result = prime * result + anyo; result = prime * result + dia; result = prime * result + mes; return result; } @Override public boolean equals(Object obj) { if (this == obj) return true; if (obj == null) return false; if (getClass() != obj.getClass()) return false; MyDate other = (MyDate) obj; if (anyo != other.anyo) return false; if (dia != other.dia) return false; if (mes != other.mes) return false; return true; } } |
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.
|
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 |
package app.ejemplo; public class AppMain { public static void main(String[] args) { MyDate date1 = new MyDate(14, 3, 1976); MyDate date2 = new MyDate(14, 3, 1976); if (date1 == date2) { System.out.println("date1 es identica a date2"); } else { System.out.println("date1 no es identica a date2"); } if (date1.equals(date2)) { System.out.println("date1 es igual a date2"); } else { System.out.println("date1 no es igual a date2"); } System.out.println("set date2 = date1"); date2 = date1; if (date1 == date2) { System.out.println("date1 es identica a date2"); } else { System.out.println("date1 no es identica a date2"); } } } |
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():
|
1 2 3 4 5 6 7 |
Fecha fecha = new Fecha(14, 3, 1976); System.out.println(fecha); //Es igual a: Fecha fecha = new Fecha(14, 3, 1976); System.out.println(fecha.toString()); |
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.
|
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 |
public class Fecha { private int dia; private int mes; private int anyo; public Fecha() { // TODO Auto-generated constructor stub } public Fecha(int dia, int mes, int anyo) { super(); this.dia = dia; this.mes = mes; this.anyo = anyo; } public int getDia() { return dia; } public void setDia(int dia) { this.dia = dia; } public int getMes() { return mes; } public void setMes(int mes) { this.mes = mes; } public int getAnyo() { return anyo; } public void setAnyo(int anyo) { this.anyo = anyo; } } |
En la clase principal, creamos una instancia de Fecha e imprimimos el objeto creado.
|
1 2 3 4 5 6 7 8 9 |
public static void main(String[] args) { Fecha fecha = new Fecha(14, 3, 1976); System.out.println(fecha); FechaConToString otraFecha = new FechaConToString(14, 3, 1976); System.out.println(otraFecha); } |
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.
|
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 |
public class FechaConToString { private int dia; private int mes; private int anyo; public FechaConToString() { // TODO Auto-generated constructor stub } public FechaConToString(int dia, int mes, int anyo) { super(); this.dia = dia; this.mes = mes; this.anyo = anyo; } public int getDia() { return dia; } public void setDia(int dia) { this.dia = dia; } public int getMes() { return mes; } public void setMes(int mes) { this.mes = mes; } public int getAnyo() { return anyo; } public void setAnyo(int anyo) { this.anyo = anyo; } @Override public String toString() { return "FechaConToString [dia=" + dia + ", mes=" + mes + ", anyo=" + anyo + "]"; } } |
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.