Está en la página 1de 5

Diario de un principiante (parte 3)

Mtodos y Clases en Java: Parte I.


Tras haber visto cmo empezar a programar en Java ahora vamos a profundizar en los conceptos propios de la POO en Java.Y, parece lgico empezar por la unidad bsica de programacin en Java, las clases. Cualquier concepto a implementar en Java debe estar encapsulado dentro de una clase. Ya sentamos en el ejemplo del captulo anterior las bases de algunos de los conceptos que veremos pero durante los prximos artculos los vamos a tratar en detalle.

Fundamentos.
Quizs, el concepto ms importante que debemos extraer de la definicin 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 mltiples objetos con caractersticas similares y un objeto es una instancia (o ejemplar) de dicha clase, o sea, mientras la clase es la representacin abstracta de un objeto, la instancia o ejemplar de dicha clase es su representacin fsica, 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. Mtodos: 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 mtodos y variables globales como en C). Al conjunto de ambos se le conoce como miembros de la clase, as que cuando leas los trminos variables miembro o mtodos miembro de la clase tal, no es ms que los componentes que la constituyen.

Declaracin 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 fsica, real de la clase, es decir, crear el objeto. Para ello, empleamos el operador new. Dicho operador asigna memoria de manera dinmica, esto es, en tiempo de ejecucin, 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 hara las veces de puntero.

El espacio de memoria que se reserva se calcula a partir de la descripcin 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.

http://www.javahispano.com

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. Clase Objeto Crea la estructura lgica que define la relacin entre sus miembros. Es la instancia de la clase. Tiene una realidad fsica, esto es, ocupa espacio en memoria.

Los mtodos.
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 expresin general de la declaracin de un mtodo es la siguiente:
acceso tipo nombreMetodo (parmetros opcionales) { //cuerpo del mtodo }

donde acceso indica el tipo de proteccin asignado a este mtodo (public, protected o private), tipo es el valor que devuelve el mtodo (puede ser un tipo primitivo o un tipo de clase) o void en caso de que no devuelva ninguno. Los parmetros, cuando los hay, se especifican por la pareja tipo_del_parmetro - identificador_del_parmetro. Esta lnea es lo que se conoce como el header del mtodo. Salvo los mtodos static o de clase, se aplican siempre a un objeto de la clase por medio del operador punto. Dicho objeto es su argumento implcito. Los mtodos tienen visibilidad directa de las variables miembro del objeto que es su argumento implcito, 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 ms que un nico valor de retorno (que puede er un objeto o un array). Se puede devolver tambin 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 mtodo o de una subclase, pero nunca de una super-clase. Los mtodos pueden definir variables locales. Su visibilidad llega desde la definicin 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 mtodo se incluye la palabra native no hay que incluir el cdigo o implementacin del mtodo. Este cdigo deber estar en una librera dinmica (DLL). Estas libreras 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 cdigo escrito en Java.

Paso de argumentos a mtodos.


2

Diario de un principiante (parte 3)

En Java los argumentos de los tipos primitivos se pasan siempre por valor. El mtodo 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 mtodo 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 tambin por valor, pero a travs de ellas se pueden modificar los objetos referenciados. En Java no se pueden pasar mtodos como argumentos a otrs mtodos (en C/C++ se pueden pasar punteros a funcin como argumentos). Lo que se puede hacer en Java es pasar una referencia a un objeto y dentro de la funcin utilizar los mtodos de ese objeto. Si un mtodo devuelve this (es decir, un objeto de la clase) o una referencia a otro objeto, ese objeto puede encadenarse con otra llamada a otro mtodo de la misma o de diferente clase y as sucesivamente. En este caso aparecern varios mtodos 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() tambin. As nos evitamos tener que hacer:
String s = "Java hispano"; String s2 = s.trim(); String s3 = s2.substring(1,4);

La secuencia de ejecucin cuando encadenamos varias llamadas a mtodos es de izquierda a derecha.

El operador return.
Ya comentamos anteriormente que la llamada a un mtodo podra acabar con la devolucin de un valor por parte de sta. ste valor puede ser de un tipo primitivo, o como veremos en el prximo artculo una referencia a un objeto. En cualquier caso, de la devolucin de este valor se encarga el operador return.

Constructores
Un punto clave de la POO es el evitar informacin incorrecta por no haber sido correctamente inicializadas las variables. Java no permite que haya variables miembro que no estn inicializadas. Asmismo, 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 mtodo que se llama automticamente cada vez que se crea un bojeto de una clase y su principal misin 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 mtodo, ste tiene caractersticas especficas como que se tiene que llamar igual que la clase y que no devuelve ningn valor (ni siquiera void), sto se debe a que el tipo que devuelve el constructor es su argumento implcito, es decir, la clase en s misma. Pero s se le puede dotar de un parmetro de restriccin aunque si se declara como private ninguna otra clase podr crear una instancia de esta clase.
3

http://www.javahispano.com

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 slo 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 parntesis. De esta forma, un constructor slo tiene que inicializar por s mismo las variables no heredadas.

Destruccin de objetos (liberacin de memoria):


Aunque los objetos son dinmicamente asignados mediante el operador new, en Java no hay destructores especficos como en C++. El sistema se ocupa automticamente de liberar la memoria de los objetos que ya han perdido la referencia, esto es, objetos que ya no tienen ningn nombre que permita acceder a ellos, por ejemplo por haber llegado al final del bloque en el que haban sido definidos, porque a la referencia se le ha asignado el valor null o porque a la referencia se le ha asignado la direccin de otro objeto. A esta caracerstica 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 cuntas referencias hay sobre cada objeto. El objeto podr ser borrado cuando el nmero de referencias sea cero. El colector de basura nunca se sabe cuando se va a activar (depende mucho de la implementacin del sistema de ejecucin de Java) pero mientras no falte memoria es muy probable que nunca se active. Si se quiere llamar explcitamente al garbage collector, se puede usar el mtodo System.gc(), aunque esto solo es tomado por la JVM como una sugerencia.

El mtodo finalize().
Algunas veces un objeto necesitar realizar algunas acciones antes de que sea destruido y que no sean las propias de liberalizacin de memorias sino de liberar recursos como el manejador de un fichero, una conexin de red o memoria reservada para funciones nativas. Hay que tener en cuenta que el colector de basura slo libera la memoria reservada con new. Si por ejemplo se ha reservado memoria con funciones nativas en C (por ejemplo, utilizando la funcin malloc()), esta memoria hay que liberarla explcitamente utilizando el mtodo finalize(). Un finalizador es un mtodo, sin valor de retorno (void), sin argumentos y que siempre se llama finalize(). Los finalizadores se llaman de modo automtico siempre que hayan sido definidos por el programador de la clase. Para realizar su tarea correctamente, un finalizador debera terminar siempre llamando al finalizador de su superclase. Es importante saber que lo nico seguro es que el mtodo 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 ms conveniente es que el programador realice de manera explcita la liberacin de recursos crticos mediante otros mtodos que el mismo llame. El mtodo System.runFinalization() "sugiere" a la JVM que ejecute los finalizadores de los objetos pendientes, los que han perdido la referencia.

El prximo captulo.
4

Diario de un principiante (parte 3)

En el siguiente artculo os seguir contando aspectos ms avanzados del manejo de clases en Java. En ste no os pongo ningn ejemplo porque con el del captulo anterior se recogen muchas de las cosas explicadas aqu. Leo Suarez est actualmente realizando el Proyecto Fin de Carrera en Java para obtener el ttulo de Ingeniero Superior de Telecomunicaciones por la Universidad de Las Palmas de Gran Canaria. Cuando no est proyectando o escribiendo para javaHispano aprovecha para disfrutar con la novia y los amigos del estupendo clima de esa maravillosa isla. Para cualquier duda o tirn de orejas, e-mail a: leo@javahispano.com

También podría gustarte