0% encontró este documento útil (0 votos)
247 vistas12 páginas

Constructores y Destructores

Este documento describe los constructores y destructores en programación orientada a objetos. 1) Los constructores inicializan los valores de un objeto cuando es creado, mientras que los destructores liberan recursos cuando un objeto ya no es usado. 2) Los constructores tienen el mismo nombre que la clase y se ejecutan automáticamente al crear un objeto, mientras que los destructores se ejecutan cuando un objeto es eliminado. 3) Los constructores y destructores son métodos especiales que ayudan a gestionar el ciclo de vida de los objet

Cargado por

Mayumi AlRu
Derechos de autor
© Attribution Non-Commercial (BY-NC)
Nos tomamos en serio los derechos de los contenidos. Si sospechas que se trata de tu contenido, reclámalo aquí.
Formatos disponibles
Descarga como DOCX, PDF, TXT o lee en línea desde Scribd
0% encontró este documento útil (0 votos)
247 vistas12 páginas

Constructores y Destructores

Este documento describe los constructores y destructores en programación orientada a objetos. 1) Los constructores inicializan los valores de un objeto cuando es creado, mientras que los destructores liberan recursos cuando un objeto ya no es usado. 2) Los constructores tienen el mismo nombre que la clase y se ejecutan automáticamente al crear un objeto, mientras que los destructores se ejecutan cuando un objeto es eliminado. 3) Los constructores y destructores son métodos especiales que ayudan a gestionar el ciclo de vida de los objet

Cargado por

Mayumi AlRu
Derechos de autor
© Attribution Non-Commercial (BY-NC)
Nos tomamos en serio los derechos de los contenidos. Si sospechas que se trata de tu contenido, reclámalo aquí.
Formatos disponibles
Descarga como DOCX, PDF, TXT o lee en línea desde Scribd

CONSTRUCTORES Y DESTRUCTORES

PROGRAMACIN ORIENTADA A OBJETOS


SWITMY MAYUMI ALVAREZ RUIZ

11

CONSTRUCTORES Y DESTRUCTORES
Los constructores y destructores son dos tipos de mtodos especiales que se ejecutan, respectivamente, al crear un nuevo objeto y cuando el recolector de basura detecta que ya no lo estamos utilizando y es posible eliminarlo de la memoria. Constructores El constructor es un mtodo especial que sirve para dar los valores iniciales a los campos de un objeto en el momento en que se crea. Debe tener el mismo nombre que la clase en la que se declara y adems es preciso que sea pblico y que no tenga ningn tipo de retorno. Las clases pueden implementar un mtodo especial llamado constructor. Un constructor es un mtodo que inicia un objeto inmediatamente despus de su creacin. De esta forma nos evitamos el tener que iniciar las variables explcitamente para su iniciacin. El constructor tiene exactamente el mismo nombre de la clase que lo implementa; no puede haber ningn otro mtodo que comparta su nombre con el de su clase. Una vez definido, se llamar automticamente al constructor al crear un objeto de esa clase (al utilizar el operador new). El constructor no devuelve ningn tipo, ni siquiera void. Su misin es iniciar todo estado interno de un objeto (sus atributos), haciendo que el objeto sea utilizable inmediatamente; reservando memoria para sus atributos, iniciando sus valores. Por ejemplo: Mi Punto( ) { inicia( 1, 1 ); } Este constructor denominado constructor por defecto, por no tener parmetros, establece el valor 1 a las variables de instancia x e y de los objetos que construya.

El compilador, por defecto ,llamar al constructor de la superclase Object() si no se especifican parmetros en el constructor. Este otro constructor, sin embargo, recibe dos parmetros: Mi Punto( int paraX, int paraY ) { inicia( paramX, paramY ); } La lista de parmetros especificada despus del nombre de una clase en una sentencia new se utiliza para pasar parmetros al constructor. Se llama al mtodo constructor justo despus de crear la instancia y antes de que new devuelva el control al punto de la llamada. As, cuando ejecutamos el siguiente programa: Hay una distincin crtica entre la forma de manipular los tipos simples y las clases en Java: Las referencias a objetos realmente no contienen a los objetos a los que referencian. De esta forma se pueden crear mltiples referencias al mismo objeto, como por ejemplo: Mi Punto p3 =p2; Aunque tan slo se cre un objeto Mi Punto, hay dos variables (p2 y p3) que lo referencian. Cualquier cambio realizado en el objeto referenciado por p2 afectar al objeto referenciado por p3. La asignacin de p2 a p3 no reserva memoria ni modifica el objeto. De hecho, las asignaciones posteriores de p2 simplemente desengancharn p2 del objeto, sin afectarlo: p2 = null; // p3 todava apunta al objeto creado con new Aunque se haya asignado null a p2, p3 todava apunta al objeto creado por el operador new.

Cuando ya no haya ninguna variable que haga referencia a un objeto, Java reclama automticamente la memoria utilizada por ese objeto, a lo que se denomina recogida de basura. Cuando se realiza una instancia de una clase (mediante new) se reserva en la memoria un espacio para un conjunto de datos como el que definen los atributos de la clase que se indica en la instanciacin. A este conjunto de variables se le denomina variables de instancia. La potencia de las variables de instancia es que se obtiene un conjunto distinto de ellas cada vez que se crea un objeto nuevo. Es importante el comprender que cada objeto tiene su propia copia de las variables de instancia de su clase, por lo que los cambios sobre las variables de instancia de un objeto no tienen efecto sobre las variables de instancia de otro. El siguiente programa crea dos objetos Mi Punto y establece los valores de x e y de cada uno de ellos de manera independiente para mostrar que estn realmente separados. Mi Punto p4 = new Mi Punto( 10, 20 ); Mi Punto p5 = new Mi Punto( 42, 99 ); System.out.println(p4.- x = + p4.x + y = + p4.y); System.out.println(p5.- x = + p5.x + y = + p5.y); Este es el aspecto de salida cuando lo ejecutamos. p4.- x = 10 y = 20 p5.- x = 42 y = 99 D. Acceso al objeto ejemplo x se convertir en p6.x. Si otros objetos llaman a inicia(), incluso si lo hacen de una manera concurrente, no se producen efectos laterales, ya que las variables de instancia sobre las que trabajan son distintas.

Destructores Los destructores son los mtodos complementarios a los constructores. Tienen la misma sintaxis que en C++ y se escriben anteponiendo el carcter "~" al nombre de la clase a la que pertenecen ("~" se consigue manteniendo pulsada la tecla ALT y mientras se pulsan en el teclado numrico de la derecha los nmeros 1, 2 y 6 en este orden). Los destructores son llamados por el recolector de basura cuando un objeto est a punto de ser borrado de memoria. Gracias a esto el objeto puede tomar acciones de finalizacin como por ejemplo liberar un recurso externo que tenga bloqueado (un fichero, un puerto de comunicaciones, un handle de una ventana Windows, etctera). Cuando un objeto no va a ser utilizado, el espacio de memoria de dinmica que utiliza ha de ser explcitamente. El recolector de basura ser el encargado de liberar una zona de memoria dinmica que haba sido reservada mediante el operador new, cuando el objeto ya no va a ser utilizado ms durante el programa (por ejemplo, sale del mbito de utilizacin, o no es referenciado nuevamente). El sistema de recogida de basura se ejecuta peridicamente, buscando objetos que ya no estn referenciados. c.) La destruccin personalizada: finalize A veces una clase mantiene un recurso que no es de Java como un descriptor de archivo o un tipo de letra del sistema de ventanas. En este caso sera acertado el utilizar la finalizacin explcita, para asegurar que dicho recurso se libera. Esto se hace mediante la destruccin personalizada, un sistema similar a los destructores de C++. Para especificar una destruccin personalizada se aade un mtodo a la clase con el nombre finalize: class Clase Finalizada{ Clase Finalizada() { // Constructor // Reserva del recurso no Java o recurso compartido

} protected void finalize() { // Liberacin del recurso no Java o recurso compartido } } El intrprete de Java llama al mtodo finalize(), si existe cuando vaya a reclamar el espacio de ese objeto, mediante la recogida de basura. Debe observarse que el mtodo finalize() es de tipo protected void y por lo tanto deber de sobreescribirse con este mismo tipo. COMO SE DECLARAN CONSTRUCTOR Cuando se declara una clase en Java, se pueden declarar uno o ms constructores opcionales que realizan la inicializacin cuando se instancia (se crea una ocurrencia) un objeto de dicha clase. Utilizando el cdigo de la seccin anterior, cuando se crea una nueva instancia de MiClase, se crean (instancias) todos los mtodos y variables, y se llama al constructor de la clase: MiClase mc; mc = new MiClase(); La palabra clave new se usa para crear una instancia de la clase. Antes de ser instanciada con new no consume memoria, simplemente es una declaracin de tipo. Despus de ser instanciado un nuevo objeto mc, el valor de i en el objeto mc ser igual a 10. Se puede referenciar la variable (de instancia) i con el nombre del objeto: mc.i++; // incrementa la instancia de i de mc

Al tener mc todas las variables y mtodos de MiClase, se puede usar la primera sintaxis para llamar al mtodo Suma_a_i() utilizando el nuevo nombre de clase mc: mc.Suma_a_i( 10 ); y ahora la variable mc.i vale 21. Luego, en Java, cuando se instancia un objeto, siempre se hace una llamada directa al constructor como argumento del operador new. Este operador se encarga de que el sistema proporcione memoria para contener al objeto que se va a crear. En C++, los objetos pueden instanciarse de diferentes formas, pero en Java solamente se pueden instanciar en la pila de memoria, es decir, solamente se pueden instanciar utilizando el operador new para poder solicitar memoria al sistema en tiempo de ejecucin y utilizar el constructor para instanciar el objeto en esa zona de memoria. Si al intentar instanciar un objeto, la Mquina Virtual Java (JVM) no puede localizar la memoria que necesita ese objeto, bien inmediatamente o haciendo ejecutarse al reciclador de memoria, el sistema lanzar un OutOfMemoryError. Tanto en Java como en C++, si no se proporciona explcitamente un constructor, el sistema proporciona uno por defecto que inicializar automticamente todas las variables miembro a cero o su equivalente, en Java. En C++, el constructor de defecto no realiza ningn tipo de inicializacin. Se puede pensar en el constructor de defecto en Java como un mtodo que tiene el mismo nombre que la clase y una lista de argumentos vaca. Y en C++, el constructor de defecto sera como la llamada cuando se instancia un objeto sin parmetros MiClase objeto; En ambos lenguajes, si se proporciona uno o ms constructores, el constructor de defecto no se proporciona automticamente y si fuese necesaria su utilizacin, tendra que proporcionarlo explcitamente el programa.

Las dos sentencias siguientes muestran cmo se utiliza el constructor en Java para declarar, instanciar y, opcionalmente, inicializar un objeto: MiClase miObjeto = new MiClase(); MiClase miObjeto = new MiClase( 1,2,3 ); Las dos sentencias devuelven una referencia al nuevo objeto que es almacenada en la variable miObjeto. Tambin se puede invocar al constructor sin asignar la referencia a una variable. Esto es til cuando un mtodo requiere un objeto de un tipo determinado como argumento, ya que se puede incluir una llamada al constructor de este objeto en la llamada al mtodo: miMetodo( new MiConstructor( 1,2,3 ) ); Aqu se instancia e inicializa un objeto y se pasa a la funcin. Para que el programa compile adecuadamente, debe existir una versin de la funcin que espere recibir un objeto de ese tipo como parmetro. Tanto en Java como en C++, cuando un mtodo o una funcin comienza su ejecucin, todos los parmetros se crean como variables locales automticas. En este caso, el objeto es instanciado en conjuncin con la llamada a la funcin que ser utilizada para inicializar esas variables locales cuando comience la ejecucin y luego sern guardadas. Como son automticas, cuando el mtodo concluye su ejecucin, se destruir (en C++) o ser marcado para su destruccin (en Java). class MiClase { int varInstancia; // Este es el constructor parametrizado MiClase( int dato ) { // rellenamos la variable de instancia con los datos // que se pasan al constructor varInstancia = dato; } void verVarInstancia() {

System.out.println( "El Objeto contiene " + varInstancia ); } } DESTRUCTOR Java no utiliza destructores (al contrario que C++) ya que tiene una forma de recoger automticamente todos los objetos que se salen del alcance. No obstante proporciona un mtodo que, cuando se especifique en el cdigo de la clase, el reciclador de memoria (garbage collector) llamar: // Cierra el canal cuando este objeto es reciclado protected void finalize() { close(); } Cada objeto tiene el mtodo finalize(), que es heredado de la clase Object. Si se necesitase realizar alguna limpieza asociada con la memoria, se puede sobreescribir el mtodo finalize() y colocar en l el cdigo que sea necesario. Los programadores C++ deben tener en cuenta que el mtodo finalize() no es un destructor. En C++, si existe un destructor, ste ser invocado siempre que el objeto se salga de mbito o vaya a ser destruido. En Java, aunque el mtodo finalize() siempre se invocar antes de que el reciclador de memoria libere la zona de memoria ocupada por el objeto, no hay garanta alguna de que el reciclador de memoria reclame la memoria de un determinado objeto, es decir, no hay garanta de que el mtodo finalize() sea invocado. La regla de oro a seguir es que no se debe poner ningn cdigo que deba ser ejecutado en el mtodo finalize(). Por ejemplo, si se necesita concluir la comunicacin con un servidor cuando ya no se va a usar un objeto, no debe ponerse el cdigo de desconexin en el mtodo finalize(), porque puede que nunca se llamado. Luego, en Java, es responsabilidad del programador escribir mtodos para realizar limpieza que no involucre a la memoria ocupada por el objeto y ejecutarlos en el instante preciso. El mtodo finalize() y el reciclador de memoria son tiles para liberar la memoria de la pila y debera restringirse

su uso solamente a eso, y no depender de ellos para realizar ningn otro tipo de limpieza. EJEMPLOS
CONSTRUCTOR
public Vehculo() { // No tiene ninguna instruccin }

Fjese en que el constructor es el nico mtodo que no tiene valor de retorno, lo que en absoluto se puede considerar equivalente a la siguiente definicin:
public void Vehculo() { // No tiene ninguna instruccin }

Si intentamos compilar el trozo de cdigo anterior obtendremos el siguiente mensaje de error:


error CS0542: 'Vehculo': member names cannot be the same as their enclosing type

La razn es que el compilador tan slo considera constructores aquellos mtodos que no tienen tipo de retorno (lo que es diferente a que tengan tipo de retorno void) y que se llama igual que la clase que los contiene. De esta forma, si intentamos declarar cualquier otro mtodo sin tipo de retorno obtendremos el siguiente mensaje de error:
error CS1520: Class, struct, or interface method must have a return type

Otra caracterstica importante de los constructores es que podemos tener varios que se diferenciarn entre s por los parmetros que tomen. Por ejemplo, a continuacin vamos a escribir un par de constructores para la clase Vehculo:
// Constructor sin parmetros public Vehculo() { marca = "Veloz"; gasolina = 0; origen = "Fbrica"; destino = "Indeterminado"; velocidad = 0; } // Constructor con parmetros public Vehculo(string nuevaMarca, int litros, string lugar1,

string lugar2, int kilometrosHora) { marca = nuevaMarca; gasolina = litros; origen = lugar1; destino = lugar2; velocidad = kilometrosHora; }

El primero de los constructores no toma ningn parmetro y le da unos valores por defecto a los campos del objeto que se est construyendo. El segundo, en cambio, permite al programador especificar todos los valores que deben tomar. Dse cuenta de que acabamos de definir en una misma clase dos mtodos con el mismo nombre pero con distinto nmero de parmetros. Esto es perfectamente correcto y recibe el nombre de "sobrecarga de mtodos". En una entrega posterior trataremos este tema con ms detalle. Para ver el funcionamiento de los dos nuevos constructores vamos a incluir en nuestra clase un nuevo mtodo que imprima por pantalla los valores de todos los campos del objeto que lo llame:
public void Imprimir() { Console.WriteLine("El coche es de la marca: {0}", marca); Console.WriteLine("El coche tiene {0} litros de gasolina", gasolina); Console.WriteLine("El coche se dirige de {0} a {1} a {2} Km/h", origen, destino, velocidad); }

Si escribimos un programa principal, puede descargarlo aqu, en el que utilizamos los dos constructores para crear dos objetos y despus imprimimos el contenido de esos objetos:
// Creamos un objeto con el constructor sin parmetros Vehculo miCoche1 = new Vehculo(); // Creamos otro objeto con el constructor con parmetros Vehculo miCoche2 = new Vehculo("Lentsimo", 50, "Sevilla", "Madrid", 80); Console.WriteLine("miCoche1"); Console.WriteLine("--------"); miCoche1.Imprimir(); Console.WriteLine("\nmiCoche2"); Console.WriteLine("--------"); miCoche2.Imprimir();

El resultado de la ejecucin ser:


miCoche1 -------El coche es de la marca: Veloz El coche tiene 0 litros de gasolina

En el coche hay 0 personas El coche se dirige de Fbrica a Indeterminado a 0 Km/h miCoche2 -------El coche es de la marca: Lentsimo El coche tiene 50 litros de gasolina En el coche hay 2 personas El coche se dirige de Sevilla a Madrid a 80 Km/h

También podría gustarte