Programación orientada a objetos: la clase Object

Programación orientada a objetos: la clase Object

Seguimos con nuestro curso de programación, este artículo vamos a hablar de una clase muy especial, la clase Object. Esta clase en Java esta caracterizada principalmente porque todas las clases de Java y todas las que nosotros hagamos heredan de esta clase, es decir, son subclases de esta clase. Tenemos que la clase Object es una superclase de todas las clases del lenguaje Java.

asignacion_atributo_object

Consecuencias de la clase Object

Las principales consecuencias que derivan de que la clase Object sea la superclase de todas las demás es que en cualquier atributo definido con un tipo Object podrá ser inicializado con cualquier tipo. Por ejemplo, si tenemos el siguiente código:

public class Ej {public static void main(String[] args) {    Object objeto;    atributo = 1;    System.out.println(objeto);    atributo = "casa";    System.out.println(objeto);}}

El atributo objeto lo podremos inicializar con cualquier valor, esto es, al objeto le podremos asignar cualquier otro objeto, sea el objeto que sea, lo mismo da un objeto Granja que un objeto lista de enteros. Vamos a añadir las siguientes lineas a nuestro método main:

atributo = new int[10];System.out.println(atributo);atributo = new String[10];System.out.println(atributo);

Si nos fijamos a la salida que nos proporciona es una salida no legible esto es porque cuando usamos la función System.out.println(...) o similares lo que hacemos es sacar por pantalla un método de la clase Object.

Principales métodos de la clase Object

La clase Object trae una serie de métodos que en algunos casos son complicados de usar y que en muchas ocasiones el usarlos es causa de un mal diseño. Entre los más importantes y los que posiblemente más usaremos son:

  • El método equals() se utiliza para comparar si dos objetos son iguales. Este método devuelve true si los objetos son iguales, o false si no lo son. Entendemos iguales a aquellos objetos que guardan el mismo estado interno (caracterizado por el valor de sus atributos) no uno concreto.
  • El método getClass() devuelve una representación en tiempo de ejecución de la clase del objeto. Este método devuelve un objeto Class con el que se puede obtener más información sobre el tipo del objeto.
  • El método toString() devuelve una cadena de texto que representa al objeto. Este método se suele utilizar para dos cosas: comparar dos objetos con esa salida o bien mostrar esa salida al usuario.

Redefiniendo nuestra clase Granja

¿Adivináis que método es? Siempre que llamamos la función System.out.println(...) o similares llamamos al método toString() de esa clase. Si por ejemplo a nuestro método le añadimos las siguientes lineas:

atributo = new Granja("Granja guay");System.out.println(atributo);

Tendremos una salida similar a:

Granja@15db9742

Esto ocurre porque no hemos redefinido el método toString() de nuestra clase Granja, estamos usando directamente el método de la clase Object y este método no sabe como imprimir el estado de nuestro objeto atributo. Para redefinirlo vamos a la clase Granja y añadimos:

@Overridepublic String toString() { return nombre;}

Lo redefinimos así, únicamente devuelva el nombre de nuestra granja, si más adelante necesitamos más lo añadimos, por ahora no nos interesa. Si ejecutamos veremos como ya sale bien:

Granja guay

Vamos a redefinir también el método equals a:

@Overridepublic boolean equals(Object obj) {    if (obj instanceof Granja) {        Granja tmp = (Granja) obj;        return tmp.nombre == this.nombre;    } else {        return false;    }}

Si probamos el método añadiendo las siguiente lineas a nuestro main:

Granja g2 = new Granja("Granja guay");System.out.println(g2.equals(atributo));Granja g3 = new Granja("Granja no guay");System.out.println(g3.equals(atributo));

Tendremos las siguientes salidas:

True

False

Por tanto nos damos cuenta que redefiniendo el método así tendremos que si comparamos dos objetos granja estos serán iguales si su atributo nombre es exactamente el mismo. Esto no es muy habitual, se suelen usar más de un atributo pero para este ejemplo sirve.

Como siempre aquí tenemos nuestro código fuente.

Para ti
Queremos saber tu opinión. ¡Comenta!