Вы находитесь на странице: 1из 3

PROGRAMACIN III

INTRODUCCIN A LAS CLASES, OBJETOS Y MTODOS 2.2. Propiedades


Instanciar un objeto En Java, la palabra new es usada para instanciar un objeto. El operador new crea el objeto en memoria y devuelve una referencia al objeto recin creado. Este objeto permanecer en memoria mientras el programa mantenga una referencia al objeto. Las siguientes sentencias declaran una referencia a Empleado y usa la palabra reservada new para asignar la referencia al nuevo objeto Empleado. Empleado e; e = new Empleado(); La referencia e est apuntando hacia el objeto Empleado en memoria. El operador new reserva memoria para el objeto y luego vaca la memoria de tal manera que ninguno de los campos del objeto contenga basura. En su lugar, todos los campos tendrn un valor inicial de cero. La tabla siguiente muestra el valor inicial que contendr un campo dependiendo de su tipo de datos. Tipo de datos byte short int long float double char boolean Referencia de cualquier tipo Valor inicial 0 0 0 0 0.0 0.0 null false null

Es importante enfatizar que dos entidades estn siendo creadas en memoria: la referencia y el objeto. En las sentencias anteriores, e es declarada como una referencia a un Empleado, lo cual quiere decir que e puedes referirse a cualquier objeto Empleado. En la segunda sentencia, e es asignada a un objeto new Empleado.

PROGRAMACIN III

Entendiendo las referencias Se podra haber declarado la referencia e y luego instanciarla del objeto Empleado. Una referencia es (tpicamente) un valor entero de 32 bits que contiene la direccin en memoria del objeto al cual se refiere. Se dice tpicamente porque el tamao de una referencia no es estrictamente definido en las Especificaciones del Lenguaje Java. En el futuro, las referencias probablemente sern enteros de 64 bits o mayores. De manera similar, pueden ser menores de 32 bits cuando son usados con sistemas operativos para pequeos dispositivos electrnicos. Debido a que las referencias son esencialmente enteros, se preguntar por qu necesitan ser declaradas como un tipo particular de datos. Esto es porque los tipos de datos estn estrictamente forzados en Java. Una referencia debe ser de un tipo de datos de clase en particular. Por ejemplo, en las siguientes sentencias, dos referencias a Empleado y una referencia a Cadena son localizadas en memoria. Empleado e1, e2, e3; String cad; Cada una de las tres referencias consume la misma cantidad de memoria y son esencialmente de tipo de datos entero. Sin embargo, las referencias e1 y e2 pueden referirse solo a objetos Empleado. La referencia s puede referirse solo a objetos String. Para ilustrar este punto, las siguientes sentencias intentan romper esta regla y no son vlidas: cad = new Empleado(); //No compila e1 = Millonario; //No compila Podr creer que al usar el operador cast se podra crear una salida a esta situacin: e1 = new Empleado(); //Vlido cad = e1; //No compila cad = (Empleado) e1; //Todava no compila cad = (String) e1; //Tampoco compila Sin embargo, el compilador sabe que los objetos String y los objetos Empleado no son compatibles y generarn errores de compilacin en las sentencias previas. Las referencias e1 y e2 son del mismo tipo de datos y pueden ser asignadas entre s. Por ejemplo: e1 = new Empleado(); e2 = e1; //Vlido La referencia e1 es asignada a un objeto new Empleado, y la referencia e2 es asignada a e1. Esto es vlido porque e1 y e2 son ambas referencias a Empleado y por tanto son del mismo tipo de datos. Este objeto new Empleado ahora tiene dos referencias apuntando a l. (Observe que solo hay un objeto Empleado en memoria porque solo usamos la palabra new una sola vez. El asignar e1 a e2 no crea un nuevo objeto. Se podra haber declarado la referencia e y luego instancias al objeto Empleado en una sola sentencia. Empleado e1 = new Empleado(); Esta sentencia crea dos elementos separados en memoria: la referencia e1 y el objeto Empleado. La referencia e1 no es un objeto. El objeto por s mismo no tiene un nombre de variable, y la nica forma de tener acceso y usarlo es utilizando una referencia al objeto. e3 = new Empleado(); e2 = e3; // qu sucede con el primer objeto? e1 = e2; // qu sucede con el primer objeto?

PROGRAMACIN III

El recolector de basura En otros programas se puede efectuar la liberacin de memoria de forma explcita, pero en Java no existe ninguna palabra reservada u operador que pueda ser usado para eliminar un objeto de la memoria. Java fue diseado para evitar los problemas de administracin de memoria que aparecen en otros lenguajes. Una JVM tiene un hilo de bajo nivel conocido como el recolector de basura, que est ejecutndose constantemente en el fondo, buscando objetos en el programa Java que ya no estn siendo usados y liberando esa memoria. El concepto de la recoleccin automtica de basura hace que los programadores se sientan excitados y nerviosos. El recolector de basura es atractivo porque los programadores no tienen que pasar horas tras horas preocupndose sobre cmo resolver problemas de administracin de memoria. Sin embargo, los programadores se sienten nerviosos porque pierden el control de ser capaces de liberar la memoria en cualquier punto del programa porque la memoria ser liberada en un programa Java solamente cuando el recolector de basura concluya que la memoria ya no est siendo usada. Un objeto es marcado para ser recogido por el recolector de basura cuando ya no es accesible en el programa. Para que esto suceda, las referencias que an se encuentran dentro del alcance de la aplicacin Java ya no deben referirse al objeto, sino que se les asigna null, se les hace que apunten hacia otro objeto o se hace que salgan de alcance. En Java no se puede liberar memoria de forma explcita. Sin embargo, hay un mtodo que se puede invocar, System.gc(), el cual hace que el recolector de bas ura invierta esfuerzos para reciclar objetos que ya no se usan, como lo establece la documentacin del fabricante. El mtodo gc() es muy dependiente de la JVM, de modo que su comportamiento es difcil de predecir. Sin embargo, es el nico mecanismo para comunicarse con el recolector de basura. public class GCDemo { public static void main(String [] args) { Empleado e1, e2, e3; e1 = new Empleado(); //Empleado #1 e2 = new Empleado(); //Empleado #2 e3 = new Empleado(); //Empleado #3 e2 = e1; e3 = null; e1 = null; } } El programa GCDemo crea tres referencias y las asigna a un nuevo objeto Empleado. La nueva palabra reservada es usada tres veces, por lo que hay tres objetos en el programa. El resultado de asignar e2 a e1 hace que el empleado #2 ya no tenga una referencia a l y pueda ser enviado a la basura en cualquier punto despus de la sentencia e2=e1. Observe que el empleado e1 ahora tiene dos referencias que apuntan a l. El asignar null a e3 hace que el empleado #3 sea inmediatamente elegible para ser enviado a la basura, porque el objeto ya no puede ser accesible. De hecho, si decide que el objeto debera ser recuperado por alguna razn, es demasiado tarde, ya que no hay manera de reubicar al objeto despus de que todas sus referencias han sido perdidas. El asignar e1 a null no causa que el empleado #1 sea enviado a la basura porque e2 sigue refirindose al objeto. La referencia e2 sale del alcance al final del mtodo main(), de modo que el objeto empleado #1 puede ser enviado a la basura inmediatamente despus de que main() finalice su ejecucin.

Вам также может понравиться