Documentos de Académico
Documentos de Profesional
Documentos de Cultura
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.
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.
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);
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.
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
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