G.Bordel >Docencia >TAP Técnicas Actuales de Programación (curso 2010-2011)
desprotegido Intro. desprotegido Temario desprotegido Calendario desprotegido RPF desprotegido Recursos protegido Práctica protegido Gest. Alum.
tema_anterior Tema 4: Elementos relacionados con la orientación a objeto tema_siguiente
  1. Objetos y clases.
  2. Estructura de la definición de una clase.
  3. Herencia.
  4. Encapsulamiento (ámbitos de accesibilidad).
  5. El bloque static y los atributos static y final.
  6. Instanciación, inicialización y eliminación de objetos.[ejercicios]
  7. Clases y métodos abstractos.[ejercicios]
  8. Interfaces.[ejercicios]
  9. Polimorfismo.
  10. Arrays*.[ejercicios]
  11. Enumeraciones.

4.6- Instanciación, inicialización y eliminación de objetos

Palabras reservadas en Java
abstractbooleanbreakbytecasecatch
charclassconst*continuedefaultdo
doubleelseextendsfinalfinallyfloat
forgoto*ifimplementsimportinstanceof
intinterfacelongnativenewpackage
privateprotectedpublicreturnshortstatic
strictfp**superswitchsynchronizedthisthrow
throwstransienttryvoidvolatilewhile

La generación de nuevos objetos ("instanciación" en la terminología al uso) se realiza mediante el operador new que se mencionó al estudiar los operadores [§3.3]. A continuación vemos unos ejemplos:

 1-
 2-
 3-
MiClase miObjeto1 = new MiClase();
MiClase miObjeto2 = new MiClase("Hola");
MiClase miObjeto3 = new MiClase("Hola",10);

Como se ve, lo que sigue al operador new tiene "aspecto" de llamada a un método, con un identificador y una lista de parámetros entre paréntesis, y efectivamente tiene este significado como veremos enseguida.

la secuencia de acciones que tiene lugar cuando se ejecuta una instanciación es la siguiente:

  1. Se reserva espacio en cantidad adecuada a la que determinan los campos definidos en la clase como propios de cada instancia (incluyendo los que hereda y otros ocultos propios de los mecanismos que implementan las capacidades del lenguaje)
  2. Se inicializan los campos que en la clase se han definido con inicialización. (Aunque pueda ser más amplia la funcionalidad, básicamente puede verse esto como una parte de la inicialización del objeto que puede ser determinada en tiempo de compilación).
  3. Se ejecuta un método denominado "constructor" que recibe los parámetros aportados en la linea de instanciación, lo que permite realizar una inicialización del objeto en determinada en tiempo de ejecución.

Los constructores (pueden ser varios con diferentes prototipos para una misma clase) son unos métodos con la función específica que acabamos de ver y que se distingen de los métodos comunes por 2 características:

  1. Su identificador debe coincidir con el de la clase.
  2. No tienen tipo/clase de retorno en su definición (ni siquiera "void" como sería el caso de un método que no devuelve nada). En todo caso esta claro que los constructores son procedimientos, no funciones, ya que sólo se utilizan tras el operador new y en tal sentencia no cabe esperar retorno.

El siguiente ejemplo muestra esto y además nos introduce dos elementos que veremos seguidamente:

 1-
 2-
 3-
 4-
 5-
 6-
 7-
 8-
public class MiClase extends OtraClase {
private int n;

public MiClase() {n=0;};
public MiClase(String s) {super(s); n=0;}
public MiClase(String s, int n) {super(s); this.n=n;}
// resto de la definición de la clase
}

Los dos elementos mencionados son los determinados por las palabras reservadas this y super. Comencemos por this: esta palabra referencia siempre al objeto sobre el que se esta trabajando, de manera que cuando en el constructor se hace referencia a this.n se trata del campo "n" del objeto que se esta construyendo (inicializando). Realmente para referirnos a un campo del propio objeto con que se trabaja no es necesario utilizar la referencia this, pero en el caso de que exista una variable interna al método o un parámetro del mismo nombre (como frecuentemente sucede en los constructores), esta es la manera de acceder al campo miembro en lugar de a la variable local. El uso de this no es exclusivo de los constructores, sino que puede realizarse en cualquier método.

El segundo elemento es la palabra reservada super; esta hace referencia a la clase "padre" de la que se define, de modo que la sentencia super() se refiere al constructor para objetos de la clase padre y por tanto inicializará la parte que nuestro nuevo objeto hereda de la clase que extiende.

A la hora de definir los constructores de nuestras clases tendremos que tener en cuenta algunas cuestiones referentes al comportamiento de Java al respecto:

  1. Si no definimos ningún constructor, el compilador se encarga de establecer uno por defecto. Éste no tendrá parámetros y se limitará a llamar al constructor de la clase padre.
  2. Si definimos al menos un constructor, ya no es válido el punto anterior de modo que, en caso de haber definido uno con parámetros, nuestra clase no dispondrá de constructor sin parámetros.
  3. Si en un constructor no se llama al constructor de la clase padre, el compilador se encarga de hacer la llamada al constructor sin parámetros como primera acción del mismo. En caso de que se haga explicitamente la llamada al constructor de la clase padre (con o sin parámetros), el compilador nos obligará a que sea la primera acción.

Del mismo modo que existen los constructores para ser ejecutados en el momento de la creación de los objetos, existe la posibilidad de ejecutar un método en el momento de su destrucción. Para ello se dispone de un método concreto en la clase Object que podremos reescribir en nuestras clases y que es llamado automáticamente cuando el sistema se disponga a eliminar el objeto. Como esta llamada no esta en la mano del programador no hay posibilidad (ni tiene sentido) establecer distintos destructores con diferentes parámetros, sino que en todo caso el destructor no lleva parámetros. Su prototipo es:

protected void finalize()

(nota.- en realidad es un poco más complejo ya que hay que añadir algo referente a excepciones, pero ese es tema de nuestra siguiente lección, y en el caso del destructor solo tiene sentido en situaciones de programación bastante avanzada. Normalmente puede utilizarse pensando en que el prototipo es el mostrado. La información concreta puede consultarse en la documentación de la clase Object y se entenderá despues de ver el siguiente capítulo.)

En Java el programador no debe ocuparse de la destrucción de los objetos (al contrario de lo que sucede en otros lenguajes como por ejemplo C++), sino que existe un mecanismo automático altamente eficaz que "controla" la existencia de objetos no referenciados (es decir, sin que existan variable apuntándoles). Cuando el sistema descubre objetos sin referencias los elimina automáticamente llamando a su destructor y reintegrando la memoria que ocupaban a la memoria libre. Veremos cómo sucede esto en el capítulo dedicado a "hilos".

Una vez visto el mecanismo de construcción y destrucción de objetos debemos profundizar en un aspecto de la construcción. Como vimos en la introducción de este capítulo [§4.1] en la memoria existe una determinada estructura relacionada con cada clase, no sólo con cada objeto, de modo que en ella se almacenan entre otras cosas los métodos, variables comunes a todos los objetos, etc. Esta estructura se genera en el momento de instanciar el primer objeto de una clase, por lo que en este caso el procedimiento es algo más complejo que los tres pasos anteriormente descritos. En realidad lo que sucede es que se realizan tres pasos similares referentes a la clase y despues los tres pasos ya indicados referentes al objeto:

  1. Se reserva espacio en cantidad adecuada a la que determinan los métodos y los campos definidos en la clase como propios de la misma (incluyendo los que hereda y otros ocultos propios de los mecanismos que implementan las capacidades del lenguaje)
  2. Se inicializan los campos que en la clase se han definido con inicialización.
  3. Se ejecuta el bloque static utilizado para inicializar la clase en el momento de su construcción en memoria [§4.5].
  4. Se reserva espacio para el objeto ...
  5. Se inicializan los campos del objeto ...
  6. Se ejecuta el constructor.

Siguiente punto: 4.7- Clases y métodos abstractos


Plataforma de soporte a curso y contenidos (c) German Bordel 2005.