G.Bordel >Docencia >TAP | Técnicas Actuales de Programación | (curso 2010-2011) | |||||||
|
|||||||||
tema_anterior | Tema 4: Elementos relacionados con la orientación a objeto | tema_siguiente |
4.6- Instanciación, inicialización y eliminación de objetos
Palabras reservadas en Java | |||||
abstract | boolean | break | byte | case | catch |
char | class | const* | continue | default | do |
double | else | extends | final | finally | float |
for | goto* | if | implements | import | instanceof |
int | interface | long | native | new | package |
private | protected | public | return | short | static |
strictfp** | super | switch | synchronized | this | throw |
throws | transient | try | void | volatile | while |
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:
|
|
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:
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:
"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:
|
|
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:
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:
static
utilizado para inicializar la clase en el momento de su
construcción en memoria [§4.5].
Siguiente punto: 4.7- Clases y métodos abstractos
Plataforma de soporte a curso y contenidos (c) German Bordel 2005. |