Buscar
Social
Ofertas laborales ES
« Conversrión de tipos en java | Main | Introduccrión a JUnit »
sábado
sep012001

Diario de un principiante (Capítulo 3)


Métodos y Clases en Java: Parte I.


Tras haber visto cómo empezar a programar en Java ahora vamos a
profundizar en los conceptos propios de la POO en Java.Y, parece lógico
empezar por la unidad básica de programación en Java, las
clases
. Cualquier concepto a implementar en Java debe estar encapsulado
dentro de una clase. Ya sentamos en el ejemplo del capítulo anterior
las bases de algunos de los conceptos que veremos pero durante los próximos
artículos los vamos a tratar en detalle.



Fundamentos.


Quizás, el concepto más importante
que debemos extraer de la definición de una clase es que ésta
define un nuevo tipo de datos. Una vez definido, este nuevo tipo de datos
lo podemos emplear para crear objetos de ese tipo, es decir, es posible
declarar elementos de esta clase de manera similar a como se declaran las
variables del lenguaje. Así, una clase es una plantilla para múltiples
objetos con características similares y un objeto es una instancia
(o ejemplar) de dicha clase, o sea, mientras la clase es la representación
abstracta de un objeto, la instancia o ejemplar de dicha clase es su representación
física, la que tiene sentido real.


Una clase, normalmente, la constituyen los siguientes
componentes:




  • Atributos: son los datos y variables, que al definirse
    dentro de la clase se llaman variables instancia de la clase. Se llama
    así porque cada instancia de la clase, es decir, cada objeto particular
    que se cree contiene su propia copia de estas variables.



  • Métodos: son las funciones de la clase que
    actuan sobre las variables instancia de ella y definen su comportamiento.


Ambos siempre se definen dentro de la clase (en Java
no existen métodos y variables globales como en C). Al conjunto
de ambos se le conoce como miembros de la clase, así que
cuando leas los términos variables miembro o métodos miembro
de la clase tal, no es más que los componentes que la constituyen.



Declaración de objetos: el operador new.


Para obtener una instancia o ejemplar de la clase se siguen dos pasos:


  • Declaramos una variable del tipo de la clase. Ésta
    será la que posea la referencia del objeto pero en este punto el
    valor de la variable es null y cualquier intento de acceder a ella
    producirá un error.



  • Obtener una copia física, real de la clase,
    es decir, crear el objeto. Para ello, empleamos el operador new.
    Dicho operador asigna memoria de manera dinámica, esto es, en tiempo
    de ejecución, al objeto y devuelve una referencia de él que
    guardaremos en la variable que creamos en el paso anterior. Para
    los que han trabajado con C/C++ ésta variable haría las veces
    de puntero.


El espacio de memoria que se reserva se calcula a
partir de la descripción de la clase y luego se llama al constructor
de ésta o a un constructor por defecto de Java si la clase carece
de él.

Bueno, y para no ser pesado, te repito lo siguiente
por última vez pero es importante que lo aprendas de memoria porque
es el concepto base para entender mejor la POO.














ClaseCrea la estructura lógica que define la relación entre
sus miembros.
ObjetoEs la instancia de la clase. Tiene una realidad física,
esto es, ocupa espacio en memoria.



Los métodos.


Como dijimos antes, con ellos definimos lo que queremos
que la clase haga. Otra de las ventajas de Java es la flexibilidad y potencia
que les proporciona, como iremos viendo. Pero veamos en este apartado sus
fundamentos.


La expresión general de la declaración
de un método es la siguiente:


acceso tipo nombreMetodo (parámetros opcionales) {
//cuerpo del método
}

donde acceso indica el tipo de protección
asignado a este método (public, protected o private), tipo es el
valor que devuelve el método (puede ser un tipo primitivo o un tipo
de clase) o void en caso de que no devuelva ninguno. Los parámetros,
cuando los hay, se especifican por la pareja tipo_del_parámetro
- identificador_del_parámetro. Esta línea es lo que se conoce
como el header del método.


Salvo los métodos static o de clase, se
aplican siempre a un objeto de la clase por medio del operador punto. Dicho
objeto es su argumento implícito. Los métodos tienen visibilidad
directa de las variables miembro del objeto que es su argumento implícito,
es decir, pueden acceder a ellas sin cualificarlas con un nombre de objeto
y el operador punto.


El valor de retorno puede ser un valor de un tipo
primitivo o una referencia. En cualquier caso no puede haber más
que un único valor de retorno (que puede er un objeto o un array).
Se puede devolver también una referencia a un objeto por medio de
un nombre de interface. El objeto devuelto debe pertenecer a una clase
que implemente esa interface. Se puede devolver como valor de retorno un
objeto de la misma clase que el método o de una subclase, pero nunca
de una super-clase.


Los métodos pueden definir variables locales.
Su visibilidad llega desde la definición al final del bloque en
el que han sido definidas. No hace falta inicializarlas en el punto que
se definien, pero el compilador no permite utilizarlas sin haberles dado
un valor. A diferencia de las variables miembro, las variables locales
no se inicializan por defecto.


Si en el header del método se incluye la
palabra native no hay que incluir el código o implementación
del método. Este código deberá estar en una librería
dinámica (DLL). Estas librerías son ficheros de funciones
compiladas normalmente en lenguajes distintos de Java. Ésta es la
forma de poder utilizar conjuntamente funciones realizadas en otros lenguajes
desde código escrito en Java.



Paso de argumentos a métodos.


En Java los argumentos de los tipos primitivos se
pasan siempre por valor. El método recibe una copia del argumento
actual. Si se modifica esta copia, el argumento original que se incluyó
en la llamada no es modificado. La forma de modificar dentro de un método
una variable de un tipo primitivo es incluirla como variable miembro en
una clase y pasar como argumento una referencia a un objeto de dicha clase.
Las referencias se pasan también por valor, pero a través
de ellas se pueden modificar los objetos referenciados.


En Java no se pueden pasar métodos como
argumentos a otrs métodos (en C/C++ se pueden pasar punteros a función
como argumentos). Lo que se puede hacer en Java es pasar una referencia
a un objeto y dentro de la función utilizar los métodos de
ese objeto.


Si un método devuelve this (es decir, un
objeto de la clase) o una referencia a otro objeto, ese objeto puede encadenarse
con otra llamada a otro método de la misma o de diferente clase
y así sucesivamente. En este caso aparecerán varios métodos
en la misma sentencia unidos por el operador punto (.). Por ejemplo, la
siguiente sentencia:


"Java hispano".trim().substring(1,4)

es correcta porque trim() devuelve String y
substring() también. Así nos evitamos tener que hacer:



String s = "Java hispano";
String s2 = s.trim();
String s3 = s2.substring(1,4);

La secuencia de ejecución cuando encadenamos varias llamadas a métodos es de
izquierda a derecha.


El operador return.


Ya comentamos anteriormente que la llamada a un método
podría acabar con la devolución de un valor por parte de
ésta. Éste valor puede ser de un tipo primitivo, o como veremos
en el próximo artículo una referencia a un objeto. En cualquier
caso, de la devolución de este valor se encarga el operador return.


Constructores


Un punto clave de la POO es el evitar información
incorrecta por no haber sido correctamente inicializadas las variables.
Java no permite que haya variables miembro que no estén inicializadas.
Asímismo, si creamos varias instancias de la misma clase, puede
acabar resultando muy pesado el tener que inicializar todas las variables
miembro para cada instancia. Por todo ello, Java nos ofrece el constructor
de la clase.

Un constructor es un método que se llama
automáticamente cada vez que se crea un bojeto de una clase y su
principal misión es la de reservar espacio de memoria al objeto
y la de inicializar todas las variables miembro. Aunque se ha dicho que
el constructor es como un método, éste tiene características
específicas como que se tiene que llamar igual que la clase y que
no devuelve ningún valor (ni siquiera void), ésto se debe
a que el tipo que devuelve el constructor es su argumento implícito,
es decir, la clase en sí misma. Pero sí se le puede dotar
de un parámetro de restricción aunque si se declara como
private ninguna otra clase podrá crear una instancia de esta clase.

Un constructor puede llamar a otro constructor
previamente definido en la misma clase por medio de la palabra this. En
este contexto, la palabra this sólo puede aparecer en la primera
sentencia de un constructor.

El constructor de una subclase puede llamar al
constructor de su superclase por medio de la palabra super, seguida de
los argumentos apropiados entre paréntesis. De esta forma, un constructor
sólo tiene que inicializar por sí mismo las variables no
heredadas.



Destrucción de objetos (liberación
de memoria):


Aunque los objetos son dinámicamente asignados
mediante el operador new, en Java no hay destructores específicos
como en C++. El sistema se ocupa automáticamente de liberar la memoria
de los objetos que ya han perdido la referencia, esto es, objetos que ya
no tienen ningún nombre que permita acceder a ellos, por ejemplo
por haber llegado al final del bloque en el que habían sido definidos,
porque a la referencia se le ha asignado el valor null o porque a la referencia
se le ha asignado la dirección de otro objeto. A esta caracerística
de Java se le llama garbage collection (recogida de basura).

En Java es normal que varias variables de tipo
referencia apunten al mismo objeto. Java lleva internamente un contador
de cuántas referencias hay sobre cada objeto. El objeto podrá
ser borrado cuando el número de referencias sea cero.

El colector de basura nunca se sabe cuando se
va a activar (depende mucho de la implementación del sistema de
ejecución de Java) pero mientras no falte memoria es muy probable
que nunca se active. Si se quiere llamar explícitamente al garbage
collector, se puede usar el método System.gc(), aunque esto solo
es tomado por la JVM como una sugerencia.


El método finalize().


Algunas veces un objeto necesitará realizar algunas acciones antes
de que sea destruido y que no sean las propias de liberalización
de memorias sino de liberar recursos como el manejador de un fichero, una
conexión de red o memoria reservada para funciones nativas. Hay
que tener en cuenta que el colector de basura sólo libera la memoria
reservada con new. Si por ejemplo se ha reservado memoria con funciones
nativas en C (por ejemplo, utilizando la función malloc()), esta
memoria hay que liberarla explícitamente utilizando el método
finalize().

Un finalizador es un método, sin valor de retorno (void), sin
argumentos y que siempre se llama finalize(). Los finalizadores se llaman
de modo automático siempre que hayan sido definidos por el programador
de la clase. Para realizar su tarea correctamente, un finalizador debería
terminar siempre llamando al finalizador de su superclase.

Es importante saber que lo único seguro es que el método
finalize() se llama justo antes del colector de basura pero no hay manera
de saber cuando, o incluso si, es llamado por lo que lo más conveniente
es que el programador realice de manera explícita la liberación
de recursos críticos mediante otros métodos que el mismo
llame.

El método System.runFinalization() "sugiere" a la JVM que ejecute
los finalizadores de los objetos pendientes, los que han perdido la referencia.



El próximo capítulo.


En el siguiente artículo os seguiré contando aspectos más
avanzados del manejo de clases en Java. En éste no os pongo ningún
ejemplo porque con el del capítulo anterior se recogen muchas de
las cosas explicadas aquí.














Leo Suarez es un Ingeniero Superior de Telecomunicaciones por la
Universidad de Las Palmas de Gran Canaria con todas sus letras, que no
son pocas, y trabaja como tal en Santa Cruz de Tenerife.
Cuando no
está saltando de isla en isla o escribiendo para javaHispano aprovecha
para disfrutar con la novia y los amigos del estupendo clima de las islas afortunadas.

Para cualquier duda o tirón de orejas, e-mail a:
leo_ARROBA_javahispano.com




Reader Comments

There are no comments for this journal entry. To create a new comment, use the form below.
Comentarios deshabilitados
Comentarios deshabilitados en esta noticia.