PRN3 10 T11 Constructores

24
29/09/2010 1 CLASES 2 CLASES 2 Variables, Variables, métodos métodos y y clases clases finales finales Iniciación Iniciación de un de un objeto objeto Destrucción Destrucción de de objeto objeto Revisado: CICLO II/2010 Revisado: CICLO II/2010 INDICE INDICE Variables, métodos y clases finales Variables, métodos y clases finales . Iniciación de un objeto Iniciación de un objeto . Constructor Constructor Paso de objetos a métodos Paso de objetos a métodos Asignación de objetos Asignación de objetos Constructor copia Constructor copia Destrucción de objetos Destrucción de objetos . Recolector de basura Recolector de basura

Transcript of PRN3 10 T11 Constructores

29/09/2010

1

CLASES 2CLASES 2

Variables, Variables, métodosmétodos y y

clasesclases finalesfinales

IniciaciónIniciación de un de un objetoobjeto

DestrucciónDestrucción de de objetoobjetoRevisado: CICLO II/2010Revisado: CICLO II/2010

INDICEINDICE

Variables, métodos y clases finalesVariables, métodos y clases finales..

Iniciación de un objetoIniciación de un objeto..

�� ConstructorConstructor

�� Paso de objetos a métodosPaso de objetos a métodos

�� Asignación de objetosAsignación de objetos

�� Constructor copiaConstructor copia

Destrucción de objetosDestrucción de objetos..

�� Recolector de basuraRecolector de basura

29/09/2010

2

Variables, métodos y clases Variables, métodos y clases

finalesfinalesLas variables Las variables finalesfinales, generalmente se , generalmente se denominan también constantes simbólicas, denominan también constantes simbólicas, porque nunca cambian su valor.porque nunca cambian su valor.

Constante simbólicaConstante simbólica porque se le dice al porque se le dice al compilador el nombre de la constante y su valor.compilador el nombre de la constante y su valor.

Declarar una referencia Declarar una referencia finalfinal a un objeto supone a un objeto supone que esa referencia sólo pueda utilizarse para que esa referencia sólo pueda utilizarse para referenciar ese objeto.referenciar ese objeto.

Ejemplo:Ejemplo:

final Cfecha cumpleaños = new Cfecha();final Cfecha cumpleaños = new Cfecha();

Cfecha fecha = new Cfecha();Cfecha fecha = new Cfecha();

//...//...

cumpleaños = fecha; //error: referencia cte.cumpleaños = fecha; //error: referencia cte.

Declarar un método final supone que la clase se Declarar un método final supone que la clase se ejecute con más eficiencia, porque el ejecute con más eficiencia, porque el compilador puede colocar el código de bytes del compilador puede colocar el código de bytes del método directamente en el lugar del programa método directamente en el lugar del programa donde se invoque a dicho método, ya que se donde se invoque a dicho método, ya que se garantiza que el método no va a cambiar.garantiza que el método no va a cambiar.

29/09/2010

3

¿Quién puede cambiarlo? Una subclase que ¿Quién puede cambiarlo? Una subclase que intente redefinirlo, pero sólo podrá hacerlo si el intente redefinirlo, pero sólo podrá hacerlo si el método no es final.método no es final.

Haga un método final cuando necesite que la Haga un método final cuando necesite que la clase se ejecute con más rapidez, pero clase se ejecute con más rapidez, pero pensando en la limitación que está imponiendo pensando en la limitación que está imponiendo a las posibles subclases de esa clase.a las posibles subclases de esa clase.

Una Una clase clase también puede ser también puede ser finalfinal. Ejemplo:. Ejemplo:

public final class Cfecha {public final class Cfecha {

//... }//... }

Cuando una clase se declara final se esta Cuando una clase se declara final se esta impidiendo que de esa clase se puedan derivar impidiendo que de esa clase se puedan derivar subclases. Además todos sus métodos se subclases. Además todos sus métodos se convierten automáticamente en final.convierten automáticamente en final.

No hay muchas razones para hacer esto, ya que No hay muchas razones para hacer esto, ya que se sacrifica una de las características más se sacrifica una de las características más potentes de la POO: la reutilización del código.potentes de la POO: la reutilización del código.

29/09/2010

4

INICIACION DE UN OBJETOINICIACION DE UN OBJETO

¿Cómo se construye un objeto de una clase ¿Cómo se construye un objeto de una clase cualquiera?cualquiera? De forma análoga a como se De forma análoga a como se construye cualquier otra variable de un tipo construye cualquier otra variable de un tipo predefinido.predefinido.

Cfecha fecha = new Cfecha()Cfecha fecha = new Cfecha()

El compilador llama a un método de iniciación, El compilador llama a un método de iniciación, constructorconstructor, para iniciar cada una de las , para iniciar cada una de las variables declaradas, y a un método de variables declaradas, y a un método de eliminación, eliminación, destructordestructor, para liberar el espacio , para liberar el espacio ocupado por dichas variables, justo al salir. ocupado por dichas variables, justo al salir.

El compilador proporciona un constructor El compilador proporciona un constructor público por omisión para cada clase definida. público por omisión para cada clase definida. Este constructor será ejecutado después que el Este constructor será ejecutado después que el operador operador newnew, secuencial y recursivamente , secuencial y recursivamente reserve memoria para cada uno de los reserve memoria para cada uno de los miembros y los inicie. miembros y los inicie.

Igualmente, el compilador proporciona para Igualmente, el compilador proporciona para cada clase de objetos un método protegido por cada clase de objetos un método protegido por omisión, que será invocado justo antes de que omisión, que será invocado justo antes de que se destruya un objeto con el fin de permitir se destruya un objeto con el fin de permitir realizar tareas de limpieza y liberar recursos.realizar tareas de limpieza y liberar recursos.

29/09/2010

5

CONSTRUCTOR CONSTRUCTOR

Una forma de asegurar que los objetos siempre Una forma de asegurar que los objetos siempre contengan valores válidos es escribir un contengan valores válidos es escribir un constructor. constructor.

Un constructor es un método especial de una Un constructor es un método especial de una clase que es llamado automáticamente siempre clase que es llamado automáticamente siempre que se crea un objeto de la misma. Su función que se crea un objeto de la misma. Su función es iniciar nuevos objetos de su clase.es iniciar nuevos objetos de su clase.

Cuando se crea un objeto, Java hace lo Cuando se crea un objeto, Java hace lo siguiente:siguiente:�� Asigna memoria para el objeto por medio del Asigna memoria para el objeto por medio del

operador operador newnew..

�� Inicia los atributos de ese objeto, ya sea a sus Inicia los atributos de ese objeto, ya sea a sus valores iniciales (si los atributos fueron valores iniciales (si los atributos fueron iniciados en su propia declaración) o a los iniciados en su propia declaración) o a los valores predeterminados por el sistema: los valores predeterminados por el sistema: los atributos numéricos a ceros, los atributos numéricos a ceros, los alfanuméricos a nulos, y las referencias a alfanuméricos a nulos, y las referencias a objetos a objetos a nullnull..

�� Llama al constructor de la clase.Llama al constructor de la clase.

29/09/2010

6

Los constructores son métodos, admiten Los constructores son métodos, admiten

parámetros igual que éstos.parámetros igual que éstos.

Cuando en una clase no especificamos Cuando en una clase no especificamos

ningún constructor, el compilador añade ningún constructor, el compilador añade

uno público por omisión sin parámetros.uno público por omisión sin parámetros.

Un constructor por omisión de una clase Un constructor por omisión de una clase

es un constructor sin parámetros que no es un constructor sin parámetros que no

hace nada.hace nada.

El constructor por omisión es necesario, porque El constructor por omisión es necesario, porque será invocado cada vez que se construya un será invocado cada vez que se construya un objeto sin especificar ningún argumento, en objeto sin especificar ningún argumento, en cuyo caso el objeto será iniciado con los valores cuyo caso el objeto será iniciado con los valores especificados cuando se declararon los especificados cuando se declararon los atributos en su clase, o con los valores atributos en su clase, o con los valores predeterminados del sistema.predeterminados del sistema.

29/09/2010

7

Características del CONSTRUCTORCaracterísticas del CONSTRUCTOR

Un constructor Un constructor tiene el mismo nombretiene el mismo nombre que la que la clase a la que pertenece. Ejemplo: el constructor clase a la que pertenece. Ejemplo: el constructor de Cfecha se denomina también Cfecha.de Cfecha se denomina también Cfecha.

No se heredaNo se hereda

No puede retornar ningún valor (incluyendo No puede retornar ningún valor (incluyendo voidvoid))

No puede ser declarado No puede ser declarado final, static, abstract, final, static, abstract, synchronized o native.synchronized o native.

Salvo en casos excepcionales, debe declararse Salvo en casos excepcionales, debe declararse siempre público.siempre público.

Características del CONSTRUCTORCaracterísticas del CONSTRUCTOR

El constructor puede sobrecargarse.El constructor puede sobrecargarse.

Un constructor no puede ser invocado Un constructor no puede ser invocado directamente, pero si indirectamente a través de directamente, pero si indirectamente a través de this. this.

La llamada a un constructor solo puede La llamada a un constructor solo puede realizarse desde dentro de otro constructor de realizarse desde dentro de otro constructor de su misma clase y debe ser siempre la primera su misma clase y debe ser siempre la primera sentencia.sentencia.

29/09/2010

8

Ejemplo:Ejemplo:

public Cfecha (int dd) // constructorpublic Cfecha (int dd) // constructor

{{

this(); //invoca al constructor Cfecha sinthis(); //invoca al constructor Cfecha sin

//parámetros//parámetros

dia = dd;dia = dd;

if (!fechaCorrecta()) {if (!fechaCorrecta()) {

System.out.println(“Fecha incorrecta.”);System.out.println(“Fecha incorrecta.”);

asignarFecha(); }asignarFecha(); }

}}

Paso de objetos a métodosPaso de objetos a métodos

Formas como un argumento puede pasar Formas como un argumento puede pasar

a un método:a un método:

�� Llamada por valorLlamada por valor. Este método copia el valor . Este método copia el valor de un argumento dentro del parámetro formal de un argumento dentro del parámetro formal del método. Por tanto, los cambios hechos en del método. Por tanto, los cambios hechos en el parámetro del método no tienen efecto en el parámetro del método no tienen efecto en el argumento usado para llamarlo.el argumento usado para llamarlo.

29/09/2010

9

Paso de objetos a métodosPaso de objetos a métodos

�� Llamada por referenciaLlamada por referencia. En este método, una . En este método, una referencia a un argumento (no el valor del referencia a un argumento (no el valor del argumento) se pasa al parámetro. Dentro del argumento) se pasa al parámetro. Dentro del método esta referencia se usa para acceso al método esta referencia se usa para acceso al argumento actual especificado en la llamada. argumento actual especificado en la llamada. Quiere decir, que cambios hechos al Quiere decir, que cambios hechos al parámetro afectarán al argumento usado para parámetro afectarán al argumento usado para llamar la subrutina.llamar la subrutina.

Paso de objetos a métodosPaso de objetos a métodos

En java, cuando pasa un tipo simple, En java, cuando pasa un tipo simple,

como int o double, a un método, éste pasa como int o double, a un método, éste pasa

por valor. por valor.

¿Qué hay que hacer para que un método ¿Qué hay que hacer para que un método

pueda modificar el valor original del pueda modificar el valor original del

argumento que se le pasa?argumento que se le pasa?

29/09/2010

10

Paso de objetos a métodosPaso de objetos a métodos

Recordemos:Recordemos:

�� Un tipo primitivo puede ser encapsulado en Un tipo primitivo puede ser encapsulado en un objeto.un objeto.

�� Java pasa los objetos por referencia a los Java pasa los objetos por referencia a los métodos.métodos.

¿Puede un método modificar el valor ¿Puede un método modificar el valor original del argumento que se le pasa original del argumento que se le pasa cuando éste es un objeto?cuando éste es un objeto?

class PasoArgumentos { class PasoArgumentos {

public static void Incrementar10(Integer param) public static void Incrementar10(Integer param) { {

int valor = param.intValue(); int valor = param.intValue();

valor +=10; valor +=10;

param = new Integer(valor); param = new Integer(valor);

// debería existir un método que permitiera// debería existir un método que permitiera

// cambiar el valor del objeto // cambiar el valor del objeto

// para que este cambio pudiera reflejarse// para que este cambio pudiera reflejarse

// afuera. Este método no existe. // afuera. Este método no existe.

} }

29/09/2010

11

public static void main(String [] args) { public static void main(String [] args) {

Integer arg = new Integer(1234);Integer arg = new Integer(1234);

Incrementar10(arg);Incrementar10(arg);

System.out.println(arg.intValue()); System.out.println(arg.intValue());

}}

}}

El resultado es 1234, El resultado es 1234, ¿qué ha ¿qué ha sucedido?sucedido? El método Incrementar10() no El método Incrementar10() no

solo no modificó la estructura de datos del solo no modificó la estructura de datos del

objeto referenciado por param, sino que objeto referenciado por param, sino que

asignó a param un nuevo objeto. asignó a param un nuevo objeto.

Para poder modificar el objeto pasado por Para poder modificar el objeto pasado por

referencia, la clase referencia, la clase IntegerInteger debería debería

proporcionar un método que permita proporcionar un método que permita

asignar un nuevo valor al objeto.asignar un nuevo valor al objeto.

29/09/2010

12

Paso de objetos a métodosPaso de objetos a métodos

¿Como solucionar este problema?¿Como solucionar este problema?

Recordemos, que una matriz es un objeto, lo Recordemos, que una matriz es un objeto, lo que significa que cuando se pase como que significa que cuando se pase como argumento a un método, será pasado por argumento a un método, será pasado por referencia.referencia.

Veamos de nuevo el ejemplo:Veamos de nuevo el ejemplo:

class PasoArgumentosMatriz class PasoArgumentosMatriz

{ {

public static void Incrementar10(int [] param) public static void Incrementar10(int [] param) { {

param[0]+=10; param[0]+=10;

} }

public static void main(String [] args) { public static void main(String [] args) {

int []arg = {1234}; int []arg = {1234};

Incrementar10(arg); Incrementar10(arg);

System.out.println(arg[0]); System.out.println(arg[0]);

}}

}}

29/09/2010

13

Asignación de ObjetosAsignación de Objetos

No olvide que cuando trabaja con objetos No olvide que cuando trabaja con objetos

lo que realmente manipula desde lo que realmente manipula desde

cualquier método son referencias a los cualquier método son referencias a los

objetos.objetos.

Ejemplo:Ejemplo:

CFecha fecha1 = new Cfecha();CFecha fecha1 = new Cfecha();

CFecha fecha2 = fecha1;CFecha fecha2 = fecha1;

Asignación de ObjetosAsignación de Objetos

En el ejemplo, al declarar una referencia En el ejemplo, al declarar una referencia

fecha2 y le asigna fecha1, tanto fecha 1 fecha2 y le asigna fecha1, tanto fecha 1

como fecha2 son referencias al mismo como fecha2 son referencias al mismo

objeto (al referenciado por fecha1).objeto (al referenciado por fecha1).

Esto demuestra que, el operador de Esto demuestra que, el operador de

asignación no sirve para copiar un objeto asignación no sirve para copiar un objeto

en otro.en otro.

29/09/2010

14

Asignación de ObjetosAsignación de Objetos

Solución: añadir a la clase Cfecha un Solución: añadir a la clase Cfecha un método como el siguiente:método como el siguiente:

public void copiar(Cfecha obj)public void copiar(Cfecha obj)

{{

dia = obj.dia;dia = obj.dia;

mes = obj.mes;mes = obj.mes;

año = obj.año;año = obj.año;

}}

Constructor copiaConstructor copia

Otra forma de iniciar un objeto es Otra forma de iniciar un objeto es

asignándole otro objeto de su misma clase asignándole otro objeto de su misma clase

en el momento de su creación. en el momento de su creación.

Lógicamente, si se crea un objeto tiene Lógicamente, si se crea un objeto tiene

que intervenir un constructor.que intervenir un constructor.

El prototipo del constructor es:El prototipo del constructor es:

nombre_clase(nombre_clase referencia_objeto)nombre_clase(nombre_clase referencia_objeto)

29/09/2010

15

Constructor copiaConstructor copia

Un constructor que se invoca para iniciar Un constructor que se invoca para iniciar

un nuevo objeto creado a partir de otro un nuevo objeto creado a partir de otro

existente es denominado existente es denominado constructor constructor copiacopia..

Añada a CFecha:Añada a CFecha:

public CFecha(CFecha obj) {public CFecha(CFecha obj) {

dia=obj.dia; mes=obj.mes;dia=obj.dia; mes=obj.mes;

año=obj.año; }año=obj.año; }

Destrucción de objetosDestrucción de objetos

Existe un método que se invoca Existe un método que se invoca

automáticamente cada vez que se va a automáticamente cada vez que se va a

destruir un objeto, sus funciones son de destruir un objeto, sus funciones son de

preparación para la terminación y preparación para la terminación y recibe el nombre genérico de finalizador recibe el nombre genérico de finalizador

(destructor en C++). El método se llama (destructor en C++). El método se llama

finalize() finalize() y realiza su tarea antes que el y realiza su tarea antes que el

recolector de basura reclame la memoria recolector de basura reclame la memoria

de ese objeto.de ese objeto.

29/09/2010

16

Destrucción de objetosDestrucción de objetosCuando se destruye un objeto ocurren Cuando se destruye un objeto ocurren

varias cosas:varias cosas:

�� Se llama al método Se llama al método finalizefinalize

�� El recolector de basura se encarga de El recolector de basura se encarga de eliminar el objeto, lo que conlleva liberar los eliminar el objeto, lo que conlleva liberar los recursos que dicho objeto tenga adjudicados.recursos que dicho objeto tenga adjudicados.

Cuando ya no hay más referencias a un Cuando ya no hay más referencias a un

objeto, éste queda automáticamente objeto, éste queda automáticamente

marcado para la recolección de basura.marcado para la recolección de basura.

DestructorDestructor

Cuando no especificamos finalizador, el Cuando no especificamos finalizador, el compilador proporciona uno a través de la clase compilador proporciona uno a través de la clase Object.Object.

Sintaxis del finalizador por omisión:Sintaxis del finalizador por omisión:protected void finalize() throws Throwable { /* sin codigo */ }protected void finalize() throws Throwable { /* sin codigo */ }

Este método no puede sobrecargarse.Este método no puede sobrecargarse.

Todos los objetos heredan un método finalize() Todos los objetos heredan un método finalize() definido en la clase Object para guardar espacio definido en la clase Object para guardar espacio y sin hacer nada.y sin hacer nada.

29/09/2010

17

//Declaración de la clase Empleado//Declaración de la clase Empleado

public class Empleadopublic class Empleado

{{

private String primerNombre;private String primerNombre;

private String apellidoPaterno;private String apellidoPaterno;

private static int cuenta = 0; private static int cuenta = 0;

//número de objetos en la memoria//número de objetos en la memoria

//iniciar empleado, sumar 1 a la cuenta//iniciar empleado, sumar 1 a la cuenta

//estática y mostrar String indicando //estática y mostrar String indicando

//que se llamó al constructor//que se llamó al constructor

public Empleado ( String nombre, String public Empleado ( String nombre, String

apellido )apellido )

{{

primerNombre = nombre;primerNombre = nombre;

apellidoPaterno = apellido;apellidoPaterno = apellido;

++cuenta; //incrementar cuenta static ++cuenta; //incrementar cuenta static

//de empleados//de empleados

System.out.println("Constructor de System.out.println("Constructor de

empleado: " + primerNombre +empleado: " + primerNombre +

” ”+apellidoPaterno);” ”+apellidoPaterno);

}}

//restar 1 de la cuenta estática cuando //restar 1 de la cuenta estática cuando

//el recolector de basura//el recolector de basura

//llama a finalize para limpiar el objeto //llama a finalize para limpiar el objeto

//y mostrar que se llamo a finalize//y mostrar que se llamo a finalize

protected void finalize()protected void finalize()

{{

29/09/2010

18

----cuenta; //decrementar cuenta cuenta; //decrementar cuenta

//estática de empleados;//estática de empleados;

System.out.println("Finalizador de System.out.println("Finalizador de

empleado: " + primerNombre +empleado: " + primerNombre +

" "+ apellidoPaterno + "; cuenta = " " "+ apellidoPaterno + "; cuenta = "

+ cuenta );+ cuenta );

}}

//obtener primer Nombre//obtener primer Nombre

public String obtenerPrimerNombre()public String obtenerPrimerNombre()

{{

return primerNombre;return primerNombre;

}}

//obtener apellido//obtener apellido

public String obtenerApellidoPaterno()public String obtenerApellidoPaterno()

{{

return apellidoPaterno;return apellidoPaterno;

}}

//método estático para obtener el valor //método estático para obtener el valor

//de la cuenta estática//de la cuenta estática

public static int obtenerCuenta()public static int obtenerCuenta()

{{

return cuenta;return cuenta;

}}

} //fin de la clase empleado} //fin de la clase empleado

29/09/2010

19

//Prueba de la clase empleado

import javax.swing.*;

public class PruebaEmpleado {

public static void main ( String []

args ){

//demostrar que cuenta es 0 antes de

//crear Empleados

String salida = "Empleados antes de

instanciar: “+ Empleado.obtenerCuenta();

//crear 2 empleados,la cuenta debe ser 2

Empleado e1=new Empleado( "Maria",

"Flores");

Empleado e2= new Empleado ( "Juan",

"Perez");

//demostrar que la cuenta es 2 despues de crear

//dos Empleados

salida += "\n\nEmpleados después de instanciar:

“+"\nvia e1.obtenerCuenta(): " +

e1.obtenerCuenta()+"\nvia e2.obtenerCuenta(): " +

e2.obtenerCuenta()+"\nvia Empleado.obtenerCuenta():

“+Empleado.obtenerCuenta();

//obtener nombre de empleados

salida += "\n\nEmpleado 1:

"+e1.obtenerPrimerNombre()+" "+

e1.obtenerApellidoPaterno()+"\nEmpleado 2:" +

e2.obtenerPrimerNombre()+ “ “

+e2.obtenerApellidoPaterno();

29/09/2010

20

//decrementar la cuenta de referencia para cada

//objeto Empleado;en este ejemplo, hay sólo una

//referencia a cada Empleado, por lo

//que estas instrucciones marcan a cada objeto

//Empleado para la recolección de basura

e1 = null;

e2 = null;

System.gc(); //sugerir una llamada al

//recolector de basura

//mostrar cuenta de objetos Empleado despues de

//llamar al recolector de basura; la cuenta

//mostrada puede ser 0, 1 o 2 dependiendo de si

//el recolector de basura se ejecuta

//inmediatamente o no y del numero de

//objetos Empleado recolectados.

salida += "\n\nEmpleados después de

System.gc():“+Empleado.obtenerCuenta();

JOptionPane.showMessageDialog(null,

salida, "Miembros estaticos“,

JOptionPane.INFORMATION_MESSAGE);

System.exit(0);

}

}//fin de la clase PruebaEmpleado

29/09/2010

21

Cuando finalice la ejecución del método Cuando finalice la ejecución del método mainmain no no se visualiza el mensaje “objeto destruido” tantas se visualiza el mensaje “objeto destruido” tantas veces como objetos hay. Eso significa que el veces como objetos hay. Eso significa que el recolector de basura, justo en este instante, no recolector de basura, justo en este instante, no está en ejecución; un poco más tarde, está en ejecución; un poco más tarde, posiblemente cuando el sistema esté libre, el posiblemente cuando el sistema esté libre, el recolector de basura identificará los objetos que recolector de basura identificará los objetos que no tienen referencias y los eliminará liberando la no tienen referencias y los eliminará liberando la memoria que ocupan.memoria que ocupan.

No se garantiza que el recolector de No se garantiza que el recolector de

basura se ejecute; por lo tanto, no se basura se ejecute; por lo tanto, no se

garantiza que el método finalize() de un garantiza que el método finalize() de un

objeto vaya a llamarse. No diseñe clases objeto vaya a llamarse. No diseñe clases

que dependan de que el recolector de que dependan de que el recolector de

basura llame al método finalize de un basura llame al método finalize de un

objeto para regresar recursos al sistema.objeto para regresar recursos al sistema.

29/09/2010

22

Si una clase tiene miembros que son Si una clase tiene miembros que son

objetos de otras clases, su finalizador se objetos de otras clases, su finalizador se

ejecuta antes que los finalizadores de los ejecuta antes que los finalizadores de los

objetos miembro. En otras palabras, el objetos miembro. En otras palabras, el

orden de llamada a los finalizadores es orden de llamada a los finalizadores es

inverso al orden de construcción.inverso al orden de construcción.

Un finalizador también se puede llamar Un finalizador también se puede llamar

explícitamente así: explícitamente así: objeto.finalize()objeto.finalize()..

Invocar a Invocar a finalizefinalize no activa un objeto para no activa un objeto para

que sea enviado a la basura. Solo cuando que sea enviado a la basura. Solo cuando

se eliminan todas las referencias que se eliminan todas las referencias que

apuntan al mismo, éste se marca como apuntan al mismo, éste se marca como

destruible.destruible.

29/09/2010

23

Recolector de basuraRecolector de basuraEl recolector de basura se ejecuta en un El recolector de basura se ejecuta en un subproceso paralelamente a su aplicación subproceso paralelamente a su aplicación limpiando la basura (objetos desreferenciados) limpiando la basura (objetos desreferenciados) en forma silenciosa y en segundo plano y nunca en forma silenciosa y en segundo plano y nunca se detiene por más de una pequeña cantidad de se detiene por más de una pequeña cantidad de tiempo.tiempo.

Si desea forzar una completa recolección de Si desea forzar una completa recolección de basura (marcar y barrer), puede hacerlo basura (marcar y barrer), puede hacerlo llamando al método llamando al método gc (garbage collector)gc (garbage collector) de de la clase la clase SystemSystem..

Recolector de basuraRecolector de basuraRuntime runtime=Runtime.getRuntime();Runtime runtime=Runtime.getRuntime();

runtime.gc();runtime.gc();

runtime.runFinalization();runtime.runFinalization();

Rara vez será necesario llamar al Rara vez será necesario llamar al

recolector de basura, a lo mejor, si acaba recolector de basura, a lo mejor, si acaba

de liberar muchos objetos ya inservibles y de liberar muchos objetos ya inservibles y

quiere que se lleven pronto la basura.quiere que se lleven pronto la basura.

Se puede sugerir llamar al recolector Se puede sugerir llamar al recolector

también así:también así:

System.gc();System.gc();

29/09/2010

24

¿Preguntas?¿Preguntas?

“No son la riqueza ni “No son la riqueza ni el esplendor, sino la el esplendor, sino la tranquilidad y el tranquilidad y el trabajo los que trabajo los que proporcionan la proporcionan la felicidad.”felicidad.”

Napoleón BonaparteNapoleón Bonaparte

phel