[Aporte] ....::: Clase Object del paquete java.lang :::...

Iniciado por horny3, 1 Octubre 2012, 02:58 AM

0 Miembros y 1 Visitante están viendo este tema.

horny3


....::: Clase Object del paquete java.lang :::...

El paquete más importante de Java es java.lang. Este paquete aporta interfaces y clases tan fundamentales para Java que están integradas con el propio lenguaje y no es preciso importarlas. Cada clase es un descendiente, directo o indirecto, de la clase Object. Cada clase que usa o escribe hereda los métodos de instancia de Object.

Los métodos heredados de Object que se discuten en esta sección son:


  • 1.-equals
  • 2.-finalize
  • 3.-getClass
  • 4.-hashCode
  • 5.-toString

1.- equals

El método equals() compara dos objetos por igualdad y devuelve true si son iguales. El método equals() proveído en la clase Object usa el operador de identidad (==) para determinar si dos objetos son iguales.


  • Para tipos de datos primitivos (boolean,byte,short,int,long,float,double), esto da el resultado correcto.
  • Para objetos, sin embargo, no. El método equals() proveído por Object comprueba si las referencias del objeto son iguales esto es, si los objetos comparados son exactamente el mismo objeto.

Ejemplo: En ste caso solo se crea un Objeto String q se almacena en memoria, cadena_2, contiene una referencia hacia este Objeto.!

Código (java) [Seleccionar]


//Creamos 1 solo objeto String
String cadena_1= "Clase Object";
String cadena_2= "Clase Object";

//Comparamos las referencias
if(cadena_1==cadena_2)
   System.out.println("Las referencias son al mismo objecto ..!!");
else
   System.out.println("Las referencias no son al mismo objecto ..!!");

//Comparamos el contenido
if(cadena_1.equals(cadena_2))
   System.out.println("El contenido es el mismo");
else
   System.out.println("El contenido no es el mismo");



Los resultados son:

         Las referencias son al mismo objecto ..!!
         El contenido es el mismo


Ejemplo: En ste caso la 1mera linea crea un nuevo Objeto String duplicando el existente en el area de memoria reservada y almacena una referencia al mismo en str_1. En la 2da linea simplemente almacena en str_2 una referencia al objeto q ya existe en memoria.!


Código (java) [Seleccionar]


//Creamos 2 objetos String
String str_1= new String("Clase Object");
String str_2= "Clase Object";

//Comparamos las referencias
if(str_1==str_2)
   System.out.println("Las referencias son al mismo objecto ..!!");
else
   System.out.println("Las referencias no son al mismo objecto ..!!");

//Comparamos el contenido
if(str_1.equals(str_2))
   System.out.println("El contenido es el mismo");
else
   System.out.println("El contenido no es el mismo");



Los resultados son:

           Las referencias no son al mismo objecto ..!!
           El contenido es el mismo


Ejemplo: Se crean 2 Objetos en la Memoria destinada para los objetos.!

Código (java) [Seleccionar]


//Creamos 2 objetos String
String cad_1= new String("Clase Object,Equals");
String cad_2= new String("Clase Object,Equals");

//Comparamos las referencias
if(cad_1==cad_2)
   System.out.println("Las referencias son al mismo objecto ..!!");
else
   System.out.println("Las referencias no son al mismo objecto ..!!");

//Comparamos el contenido
if(cad_1.equals(cad_2))
   System.out.println("El contenido es el mismo");
else
   System.out.println("El contenido no es el mismo");



Los resultados son:

          Las referencias no son al mismo objecto ..!!
          El contenido es el mismo   
     

2.-finalize

La clase Object provee un método de llamada de regreso, finalize(), que puede invocarse sobre un objeto cuando se convierte en basura. La implementación de finalize() de Object no hace nada puede sobrepasar finalize() para limpiar, tal como liberar recursos.

El método finalize() puede llamarse automáticamente por el sistema, pero cuando se llama, o incluso si se llama, es incierto. Por eso, no debería depender en este método para hacer la limpieza por usted. Por ejemplo, si no cierra los descriptores de archivo después de efectuar E/S y espera que finalize() los cierre por usted, podría quedarse sin descriptores de archivo.


  • Método que nos permite gestionar la limpieza de los recursos utilizados en la clase antes de que esta sea eliminada por el Garbage Collector. En la clase Object no ejecuta nada. Es un método que está sobrescrito en las clases que lo utilicen.

Código (java) [Seleccionar]


protected void finalize() throws Throwable


La definición del método finalize() tiene la siguiente estructura:

Código (java) [Seleccionar]


protected void finalize() throws Throwable
{
    System.out.println("Finalizando el Objeto");
    super.finalize();
}



Al incluir el método finalize() sobre un objeto estaremos reescribiendo el método finalize() por defecto que viene en la clase Object. Mediante la sentencia super.finalize() estamos ejecutando el método finalize() de las clases padre.
Aunque los métodos finalize() se ejecutarán cuando pase el garbage collector, existe la posibilidad de sugerir a la máquina virtual java (jvm) que se ejecute el finalize de los métodos. Esto lo conseguiremos ejecutando el método runFinalization() de la clase System.


  • El método System.runFinalization() solo es una sugerencia. No implica una ejecución directa de los métodos finalize().

El código de ejecución del System.runFinalization() sería el siguiente:

Código (java) [Seleccionar]


public static void main(String[] args)
{
   FinalizarUnObjeto fuo = new FinalizarUnObjeto();
   System.out.println(fuo.toString());
   fuo = null;
   System.runFinalization();
}



.-getClass

El método getClass() es un método final (no puede sobreescribirse) que devuelve una representación en tiempo de ejecución de la clase del objeto. El método getClass() devuelve un objeto Class, el cual tiene métodos que puede usar para obtener información sobre la clase, tal como su nombre (getSimpleName()), su superclase (getSuperclass()), y las interfaces que implementa (getInterfaces()).

Por ejemplo, el siguiente método obtiene y despliega el nombre de clase de un objeto, tambien a que super clase pertenece:

Código (java) [Seleccionar]


//Creamos una varible del tipo de la clase, luego con NEW creamos el objeto.
Clase_Object_GetClass objGetClass= new Clase_Object_GetClass();
 
//Nombre de clase
System.out.println("Nombre de la clase es : "+objGetClass.getClass().getSimpleName());
//Su super Clase
System.out.println("Su super Clase es  : "+objGetClass.getClass().getSuperclass());



Un uso muy manejado del método getClass() es crear un ejemplar de una clase sin conocer la clase en el momento de la compilación.
La clase Class, en el paquete java.lang, tiene un gran número de métodos (más de 50). Por ejemplo, puee comprobar para ver si la clase es una anotación (isAnnotation()), una interfaz (isInterface()), o una enumeración (isEnum()). Puede ver cuáles son los campos del objeto (getFields()) o cuáles son sus métodos (getMethods()), y así sucesivamente.

4.-hashCode

El valor devuelto por hashCode() es el código de identificación (hash) del objeto, que es la dirección de memoria del objeto en hexadecimal.

Por definición, si dos objetos son iguales, el código de identificación debe también ser igual. Si sobrepasa el método equals, cambia la forma en que se comparan los objetos y la implementación de hashCode() de Object ya no es válida. Por eso, si sobrepasa el método equals(), debe también sobrepasar el método hashCode() también.

Código (java) [Seleccionar]


        //Creamos una varible del tipo de la clase, luego con NEW creamos el objeto.
        Clase_Object_GetClass objGetClass= new Clase_Object_GetClass();

         System.out.println("Dirección de memoria del objeto en hexadecimal : "+objGetClass.hashCode());



5.-toString

Debería siempre considerar el método toString() en sus clases. El método toString() de Object devuelve una representación  String del objeto, que es muy útil para la depuración. La representación String para un objeto depende enteramente del objeto, que es la razón por la que necesita sobrepasar a toString() en sus clases.

Este método devuelve una cadena de texto que representa al objeto. Se puede utilizar toString para mostrar un objeto. La representación de un objeto depende enteramente del objeto. El String de un objeto entero es el valor del entero mostrado como texto.

Por ejemplo, se podría mostrar una representación del Thread actual de la siguiente forma.

Código (java) [Seleccionar]


System.out.println(Thread.currentThread().toString());
System.out.println(new Integer(44).toString());

Observo, analizo y callo mientras me voy decepcionando en silencio.