Вы находитесь на странице: 1из 70

Se explicar, en primer lugar, qu son las clases y los objetos, paso fundamental para poder programar en Java.

Veremos, a continuacin, que una clase puede contener atributos y mtodos en su interior, por lo que tambin. Estudiaremos cmo se relacionan las clases mediante la herencia y, por ltimo, explicaremos cmo se crean y utilizan los paquetes en Java

Capacidad para encapsular y aislar la informacin del diseo y ejecucin. Mecanismos en programacin:  Procedimientos y funciones  Tipos de datos abstractos (TDA)  Objetos: son TDA a los que se aaden mecanismos como herencia, mtodos, etc.

Si sabes algo sobre programacin (y si no, te lo cuento yo), habrs odo hablar de lenguajes orientados y no orientados a objetos. El lenguaje C no est orientado a objetos. C++ s lo est. Java tambin. Pensar en objetos supone tener que cambiar el chip para enfocar la resolucin de problemas de una manera distinta a como se ha hecho tradicionalmente. Pero, qu es un objeto?. La mejor forma de entenderlo es mediante una analoga. Consideremos un ordenador, por ejemplo. Si lo abrimos y lo observamos detenidamente, podemos comprobar que est formado por la placa base, el procesador, la memoria, el disco duro, etc. Si, a su vez, examinamos por separado cada parte, veremos que el disco duro est compuesto por varios discos superpuestos, las cabezas lectoras, un circuito controlador, etc. Podemos ver tambin que cada mdulo de memoria est construido a partir de circuitos integrados de memoria ms pequeos interconectados entre s, y lo mismo ocurre con todas las dems partes del ordenador: el todo est formado por piezas, y cada pieza est compuesta por partes ms pequeas.

Supongamos que se nos estropea el disco duro y necesitamos comprar otro. Si cada fabricante de PCs diseara discos duros para sus ordenadores basndose en especicaciones propias, stos seran incompatibles entre s, y nos veramos obligados a buscar el modelo de disco adecuado para nuestro ordenador. Por suerte, existen en la industria estndares gracias a los cuales cada empresa puede fabricar internamente los discos duros como mejor les parezca, siempre y cuando la interfaz de conexin con el ordenador cumpla con un estndar determinado y aceptado por todos los fabricantes (IDE, SCSI, etc.). De este modo, tenemos un objeto (el disco duro) que realiza una funcin determinada (almacenar informacin) sobre unos atributos (los datos), y que se comunica con el resto del sistema mediante una interfaz determinada y bien conocida.

Nunca has abierto un ordenador y no sabes lo que hay dentro?. Bueno, usar un ejemplo ms sencillo. Cualquier juego de construccin como los de Lego o Tente est formado por elementos bsicos (las piezas). Cada pieza, por s sola, no tiene mucha utilidad, pero podemos juntarlas para construir lo que nos d la gana. Si podemos construir cosas es porque cada pieza trae una serie de hendiduras que encajan en las de las dems. As que tenemos una serie de objetos (las piezas) con una interfaz comn (las hendiduras) y que nos permiten realizar una construccin (el programa). Mediante estos ejemplos ya podemos vislumbrar algunas de las caractersticas de los objetos:  Realizan una tarea por s solos.  Proporcionan encapsulacin: Es posible ocultar las partes internas de la implementacin de un objeto, permitiendo el acceso slo a travs de una interfaz bien conocida y denida.

 Son reutilizables.  Proporcionan escalabilidad (el programa puede crecer) y modularidad (el programa se puede dividir en bloques que faciliten su comprensin). En Java ocurre lo mismo que en los ejemplos anteriores. Programaremos una serie de objetos independientes con una funcionalidad determinada, y los juntaremos para crear un programa. Pero, para crear objetos, primero debemos hablar de las clases.

Clases en Java. Atributos y Mtodos  Cuando escribimos un programa en un lenguaje orientado a objetos, no estamos deniendo objetos, sino clases. Una clase es la unidad fundamental en programacin, la pieza de Lego. El problema es... que no existe. Es una abstraccin. Es la plantilla que utilizaremos posteriormente para crear un conjunto de objetos con caractersticas similares.  Supongamos que denimos una clase Coche. No tiene entidad fsica. Hablamos de un coche en general, sin especicar de qu tipo de coche se trata. Podemos asignarle un comportamiento y una serie de caractersticas, como se muestra en la gura 2.1. A partir de esa clase Coche, podremos crear nuestros objetos (tambin llamados instancias), que sern las realizaciones fsicas de la clase. En el ejemplo, se muestran un Seat Panda, un Opel Corsa, y un Renault Megane. Todos ellos comparten una serie de caractersticas comunes por las que podemos identicarlos como coches.

Clases en Java. Atributos y Mtodos  Vemos en la gura que, respecto al comportamiento, podemos arrancar y detener nuestro coche. Esos son los mtodos de la clase. En cuanto a las caractersticas (llamadas atributos), tenemos las variables estadoMotor, color, y modelo. Para denir nuestra clase en Java, lo haremos de la siguiente manera (programa 2.3.1):

Programa 2.3.1 La clase Coche. class Coche { boolean estadoMotor = false; String color; String modelo; void arrancar(){ if(estadoMotor == true) System.out.println("El coche ya est arrancado"); else{ estadoMotor=true; System.out.println("Coche arrancado"); } } void detener(){ if(estadoMotor == false) System.out.println("El coche ya est detenido"); else{ estadoMotor=false; System.out.println("Coche detenido"); } } } // fin de la clase Coche

Analicemos paso a paso cada parte de la clase:


 Las clases se denen con la palabra reservada class. Todo el cdigo que pertenezca a esa clase se encierra entre dos llaves.  Los nombres de las clases, por norma, comienzan con mayscula.  A continuacin tenemos tres atributos, denidos por las variables estado Motor, color y modelo.  Los atributos nos denen las caractersticas que tendr cada objeto de esa clase, y que podrn  ser distintas para cada uno de ellos. Es decir, cada coche ser de un modelo determinado, de un color, y su motor estar encendido o apagado.  Por ltimo, tenemos dos mtodos, arrancar() y detener(). Los mtodos nos denen el comportamiento que tendrn los objetos de esa clase.  En nuestro ejemplo, podremos arrancar o detener el motor de nuestros coches.

Atributos: estos son los datos que caracterizan al objeto. Son variables que almacenan datos relacionados al estado de un objeto. Mtodos (usualmente llamados funciones de miembro): Los mtodos de un objeto caracterizan su comportamiento, es decir, son todas las acciones (denominadas operaciones) que el objeto puede realizar por s mismo. Estas operaciones hacen posible que el objeto responda a las solicitudes externas (o que acte sobre otros objetos). Adems, las operaciones estn estrechamente ligadas a los atributos, ya que sus acciones pueden depender de, o modificar, los valores de un atributo. Identidad: El objeto tiene una identidad, que lo distingue de otros objetos, sin considerar su estado. Por lo general, esta identidad se crea mediante un identificador que deriva naturalmente de un problema (por ejemplo: un producto puede estar representado por un cdigo, un automvil, por un nmero de modelo, etc.).

El modelo objeto  Abstraccin Las caractersticas esenciales del objeto Documento: insertar, borrar, ...
 El concepto de encapsulacin:
 La encapsulacin es un mecanismo que consiste en organizar datos y mtodos de una estructura, conciliando el modo en que el objeto se implementa, es decir, evitando el acceso a datos por cualquier otro medio distinto a los especificados. Por lo tanto, la encapsulacin garantiza la integridad de los datos que contiene un objeto.

Ocultacin de datos  El usuario de una clase en particular no necesita saber cmo estn estructurados los datos dentro de ese objeto, es decir, un usuario no necesita conocer la implementacin Al evitar que el usuario modifique los atributos directamente y forzndolo a utilizar funciones definidas para modificarlos (llamadas interfaces), se garantiza la integridad de los datos (por ejemplo, uno puede asegurarse de que el tipo de datos suministrados cumple con nuestras expectativas bien que los se encuentran dentro del periodo de tiempo esperado).  La encapsulacin define los niveles de acceso para elementos de esa clase. Estos niveles de acceso definen los derechos de acceso para los datos, permitindonos el acceso a datos a travs de un mtodo de esa clase en particular, desde una clase heredada o incluso desde cualquier otra clase. Existen tres niveles de acceso:

 La encapsulacin define los niveles de acceso para elementos de esa clase. Estos niveles de acceso definen los derechos de acceso para los datos, permitindonos el acceso a datos a travs de un mtodo de esa clase en particular, desde una clase heredada o incluso desde cualquier otra clase. Existen tres niveles de acceso:

pblico: funciones de toda clase pueden acceder a los datos o mtodos de una clase que se define con el nivel de acceso pblico. Este es el nivel de proteccin de datos ms bajo protegido: el acceso a los datos est restringido a las funciones de clases heredadas, es decir, las funciones miembro de esa clase y todas las subclases privado: el acceso a los datos est restringido a los mtodos de esa clase en particular. Este es nivel ms alto de proteccin de datos

Herencia  Por lo explicado hasta ahora, podra parecer que la programacin orientada a objetos se basa simplemente en crear clases independientes que se relacionan entre s. En realidad, existe una relacin ms compleja entre clases. Es la herencia.  El concepto de herencia:  La herencia es especfica de la programacin orientada a objetos, donde una clase nueva se crea a partir de una clase existente. La herencia (a la que habitualmente se denomina subclases) proviene del hecho de que la subclase (la nueva clase creada) contiene las atributos y mtodos de la clase primaria. La principal ventaja de la herencia es la capacidad para definir atributos y mtodos nuevos para la subclase, que luego se aplican a los atributos y mtodos heredados.

 Todas las clases en Java existen dentro de una jerarqua. Cada clase tiene una (y slo una) clase por encima de ella, denominada superclase, y cualquier nmero de clases (o ninguna) por debajo.  A estas ultimas se las denomina subclases.  Una clase heredara los mtodos y variables de su superclase. Del mismo modo, sus subclases heredarn los mtodos y variables de esa clase.

 Observemos la figura 2.2. En ella se muestran 5 clases y su relacin de herencia. Por encima de todas tenemos una superclase Animal, con un atributo peso y un mtodo comer() (todos los animales tienen peso y comen). Debajo de sta aparecen otras dos clases con tipos de animales: Ovparos y Mamiferos1 . Los Ovparos pueden ponerHuevos(). Los Mamferos pueden parir() y amamantar() a sus cras, y pueden tener la sangreCaliente, o no (el tipo boolean especifica que ese atributo puede ser cierto o falso). Estas dos clases, aparte de tener su propio comportamiento y sus caractersticas, heredan tambin los mtodos y atributos de su superclase. Por ello, tanto los Mamferos como los Ovparos pueden comer() y tienen un peso.  Asimismo, la clase Mamfero tiene dos subclases que heredan de ella. Son las subclases Perro y Delfn. El perro, por ejemplo, tendr un color de pelo determinado, y podr ladrar. Y adems, debido a la herencia, tendr un peso, podr comer, tendr la sangre caliente y amamantar a sus cras.

 Queda claro?. Cada subclase extiende y concreta la funcionalidad y caractersticas de su superclase. Es decir, se especializa ms.  Bien, supongamos que tenemos una clase escrita en Java. La manera de especificar que una clase es subclase de otra se hace utilizando la palabra reservada extends. En el siguiente ejemplo definiremos las clases Animal y Mamfero.  Programa 2.4.1 La clase Mamfero y su superclase Animal. class Animal{ float peso; void comer(){ } } class Mamifero extends Animal{ boolean sangreCaliente; void parir(){ } void amamantar(){ } }

 Vemos que, al definir la clase Mamifero, aadimos la coletilla extends Animal, para especificar que heredamos de la clase Animal. Aprovecho para comentar que, cuando se programa, no se utilizan acentos. Por eso definimos la clase como Mamifero, en vez de Mamfero.  Al principio de este apartado se explico que todas las clases existen dentro de una jerarqua y que siempre heredan de su superclase. Seguro que, a estas alturas, estn preguntando de quien hereda la clase Animal, puesto que no hemos aadido ningn extends.  La respuesta es que todas las clases en las que no se especifique nada, heredaran de la clase Object.  Esta clase es la superior en la jerarqua de clases de Java, y es la nica que no hereda de nadie.  Un ultimo apunte. El hecho de que una clase Java solo pueda heredar de su superclase se denomina herencia simple. Todas las clases heredan de una, y slo una clase (excepto la claseObject, claro, que no hereda de nadie). En otros lenguajes, como C++, existe el concepto de herencia mltiple, en el que una clase puede heredar de dos o ms superclases. Pero no en Java, lo cual simplifica enormemente la programacin sin restarle potencia.

 Herencia mltiple  Algunos lenguajes orientados a objetos, como C++ permiten herencias mltiples, lo que significa que una clase puede heredar los atributos de otras dos superclases. Este mtodo puede utilizarse para agrupar atributos y mtodos desde varias clases dentro de una sola.

Polimorfismo  El concepto de polimorfismo:  La palabra polimorfismo proviene del griego y significa que posee varias formas diferentes. Este es uno de los conceptos esenciales de una programacin orientada a objetos. As como la herencia est relacionada con las clases y su jerarqua, el polimorfismo se relaciona con los mtodos.  En general, hay tres tipos de polimorfismo: Polimorfismo de sobrecarga Polimorfismo paramtrico (tambin llamado polimorfismo de plantillas) Polimorfismo de inclusin (tambin llamado redefinicin o subtipado)

Polimorfismo de sobrecarga  El polimorfismo de sobrecarga ocurre cuando las funciones del mismo nombre existen, con funcionalidad similar, en clases que son completamente independientes una de otra (stas no tienen que ser clases secundarias de la clase objeto). Por ejemplo, la clase complex, la clase image y la clase link pueden todas tener la funcin "display". Esto significa que no necesitamos preocuparnos sobre el tipo de objeto con el que estamos trabajando si todo lo que deseamos es verlo en la pantalla.  Por lo tanto, el polimorfismo de sobrecarga nos permite definir operadores cuyos comportamientos varan de acuerdo a los parmetros que se les aplican. As es posible, por ejemplo, agregar el operador + y hacer que se comporte de manera distinta cuando est haciendo referencia a una operacin entre dos nmeros enteros (suma) o bien cuando se encuentra entre dos cadenas de caracteres (concatenacin).

Polimorfismo de paramtrico  El polimorfismo paramtrico es la capacidad para definir varias funciones utilizando el mismo nombre, pero usando parmetros diferentes (nombre y/o tipo). El polimorfismo paramtrico selecciona automticamente el mtodo correcto a aplicar en funcin del tipo de datos pasados en el parmetro.

Polimorfismo de subtipado  La habilidad para redefinir un mtodo en clases que se hereda de una clase base se llama especializacin. Por lo tanto, se puede llamar un mtodo de objeto sin tener que conocer su tipo intrnseco: esto es polimorfismo de subtipado. Permite no tomar en cuenta detalles de las clases especializadas de una familia de objetos, enmascarndolos con una interfaz comn (siendo esta la clase bsica).  Imagine un juego de ajedrez con los objetosrey, reina, alfil, caballo, torre y pen, cada uno heredando el objeto pieza.  El mtodo movimiento podra, usando polimorfismo de subtipado, hacer el movimiento correspondiente de acuerdo a la clase objeto que se llama. Esto permite al programa realizar el movimiento.de_pieza sin tener que verse conectado con cada tipo de pieza en particular.

Modularidad  Subdivisin de una aplicacin en otras ms pequeas (mdulos).  Un mdulo es un conjunto de clases Editor, Fuente, Documento, Otras propiedades  concurrencia (multitarea)  Persistencia (guardar)  uso de excepciones (errores)

Cronologa resumida:  Fortran (1958)  LISP (1959)  BASIC (1964)  Pascal (1969)  Prolog (1971)  C++ (1986)  Object Pascal (1988)  CLOS (1989)  Java (1995) Beneficios:  Mejor mantenimiento  Estructuras ms reales de la informacin  Escalabilidad  Adaptabilidad

Orgenes e historia del lenguaje Java  El lenguaje de programacin Java fue desarrollado por Sun Microsystems en 1991, como parte de un proyecto de investigacin para desarrollar software que pudiera ejecutarse en todo tipo de dispositivos electrnicos domsticos, como televisiones o frigorficos. Dado que estos aparatos no tenan mucha potencia ni memoria (al menos, por entonces), se buscaba que fuera un lenguaje rpido, eficiente y que generara un cdigo muy pequeo. Adems, si se quera instalar en dispositivos tan heterogneos y de distintos fabricantes, el lenguaje deba ser independiente de la plataforma en la que se ejecutase.

Caractersticas de Java  Simplicidad: Java est basado en C++, por lo que, si se ha programado en C o en C++, el aprendizaje de la sintaxis de Java es casi inmediato. Sin embargo, se modificaron o eliminaron ciertas caractersticas que en C++ son fuente de problemas, como la aritmtica de punteros, las estructuras, etc. Adems, no debemos preocuparnos de la gestin de la memoria. Java se ocupa de descargar los objetos que no utilicemos. Es prcticamente imposible, por ejemplo, escribir en una posicin de memoria de otro programa.  Orientacin a Objetos (OO): Cualquier lenguaje moderno esta orientado a objetos, ya que su utilidad y ventajas con respecto a la programacin tradicional orientada a procedimientos ha sido ampliamente demostrada en los ltimos 30 aos.  Distribuido: Java posee una extensa coleccin de herramientas que proporcionan la capacidad de trabajar en red de forma simple y robusta.

 Robusto: Como ya se comento antes, Java permite escribir programas fiables con mucho menor esfuerzo que en otros lenguajes. El compilador detecta problemas, como la sobre escritura de posiciones de memoria, que en otros lenguajes apareceran en tiempo de ejecucin. Adems, la eliminacin del uso de punteros en elementos como cadenas de caracteres o arrays evita muchos problemas que son comunes (y difciles de depurar) en C o C++.  Seguro: Java esta pensado para ser utilizado en red, por lo que se ha cuidado mucho la seguridad. En principio, se supone que es capaz de evitar que se rebase la pila del sistema en tiempo de ejecucin, que se corrompa la memoria externa a un proceso, o que se pueda acceder a ficheros locales de un ordenador que esta ejecutando un applet en su navegador, por ejemplo.

 Independencia de la plataforma: He aqu una de las caractersticas ms importantes y conocidas de Java. Un programa en Java sigue la filosofa WORE (Write Once, Run Everywhere), es decir, que una vez escrito, puede ejecutarse en cualquier plataforma hardware con cualquier sistema operativo sin recompilar el cdigo.

Los comentarios en java pueden hacerse de dos formas: /* Esto es un comentario de varias lneas */ int variable; //Esto es un comentario al final de lnea Las variables (a lo que se llama atributo) son zonas de memoria donde pueden almacenarse valores. Estos valores pueden ser un numero, un carcter, un trozo de texto, etc. Cada variable tiene un tipo, un nombre y un valor. Para utilizar una variable, es preciso declararla primero. Por ejemplo:  int numeroEntero;  char caracter;  String cadenaTexto;  boolean motorEnMarcha;

Concepto de Clase  Una clase es una agrupacin de datos (variables o campos) y de funciones (mtodos) que operan sobre esos datos. La definicin de una clase se realiza en la siguiente forma: [public] class Classname { // definicin de variables y mtodos ... }  Donde la palabra public es opcional: si no se pone, la clase tiene la visibilidad por defecto, esto es, slo es visible para las dems clases del package. Todos los mtodos y variables deben ser definidos dentro del bloque {...} de la clase.  Un objeto (en ingls, instance) es un ejemplar concreto de una clase. Las clases son como tipos de variables, mientras que los objetos son como variables concretas de un tipo determinado. Classname unObjeto; Classname otroObjeto;

A continuacin se enumeran algunas caractersticas importantes de las clases: 1. Todas las variables y funciones de Java deben pertenecer a una clase. No hay variables y funciones globales. 2. Si una clase deriva de otra (extends), hereda todas sus variables y mtodos. 3. Java tiene una jerarqua de clases estndar de la que pueden derivar las clases que crean los usuarios. 4. Una clase slo puede heredar de una nica clase (en Java no hay herencia mltiple). Si al definir una clase no se especifica de qu clase deriva, por defecto la clase deriva de Object. La clase Object es la base de toda la jerarqua de clases de Java. 5. En un fichero se pueden definir varias clases, pero en un fichero no puede haber ms que una clase public. Este fichero se debe llamar como la clase public que contiene con extensin *.java. Con algunas excepciones, lo habitual es escribir una sola clase por fichero.

6. 7.

8. 9.

Si una clase contenida en un fichero no es public, no es necesario que el fichero se llame como la clase. Los mtodos de una clase pueden referirse de modo global al objeto de esa clase al que se aplican por medio de la referencia this. Las clases se pueden agrupar en packages, introduciendo una lnea al comienzo del fichero (package packageName;). Esta agrupacin en packages est relacionada con la jerarqua de directorios y ficheros en la que se guardan las clases.

Concepto de Interface  Una interface es un conjunto de declaraciones de funciones. Si una clase



implementa (implements). Una interface, debe definir todas las funciones especificadas por la interface. Las interfaces pueden definir tambin variables finales (constantes). Una clase puede implementar ms de una interface, representando una alternativa a la herencia mltiple. En algunos aspectos los nombres de las interfaces pueden utilizarse en lugar de las clases. Por ejemplo, las interfaces sirven para definir referencias a cualquier objeto de cualquiera de las clases que implementan esa interface. Con ese nombre o referencia, sin embargo, slo se pueden utilizar los mtodos de la interface. ste es un aspecto importante del polimorfismo. Una interface puede derivar de otra o incluso de varias interfaces, en cuyo caso incorpora las declaraciones de todos los mtodos de las interfaces de las que deriva (a diferencia de las clases, las interfaces de Java s tienen herencia mltiple).

 

EJEMPLO DE DEFINICIN DE UNA CLASE  A continuacin se reproduce como ejemplo la clase Circulo, explicada en el Apartado 1.3.4.
// fichero Circulo.java public class Circulo extends Geometria { static int numCirculos = 0; public static final double PI=3.14159265358979323846; public double x, y, r; public Circulo(double x, double y, double r) { this.x=x; this.y=y; this.r=r; numCirculos++; } public Circulo(double r) { this(0.0, 0.0, r); } public Circulo(Circulo c) { this(c.x, c.y, c.r); } public Circulo() { this(0.0, 0.0, 1.0); } public double perimetro() { return 2.0 * PI * r; }

public double area() { return PI * r * r; } // mtodo de objeto para comparar crculos public Circulo elMayor(Circulo c) { if (this.r>=c.r) return this; else return c; } // mtodo de clase para comparar crculos public static Circulo elMayor(Circulo c, Circulo d) { if (c.r>=d.r) return c; else return d; } } // fin de la clase Circulo En este ejemplo se ve cmo se definen las variables miembro y los mtodos (cuyos nombres se han resaltado en negrita) dentro de la clase. Dichas variables y mtodos pueden ser de objeto o de clase (static). Se puede ver tambin cmo el nombre del fichero coincide con el de la clase public con la extensin *.java.

Variables Miembro  A diferencia de la programacin algortmica clsica, que estaba centrada


en las funciones, la programacin orientada a objetos est centrada en los datos. Una clase est constituida por unos datos y unos mtodos que operan sobre esos datos.

Variables miembro de objeto  Cada objeto, es decir cada ejemplar concreto de la clase, tiene su propia
copia de las variables miembro. Las variables miembro de una clase (tambin llamadas campos) pueden ser de tipos primitivos (boolean, int, long, double, ) o referencias a objetos de otra clase (composicin).  Un aspecto muy importante del correcto funcionamiento de los programas es que no haya datos sin inicializar. Por eso las variables miembro de tipos primitivos se inicializan siempre de modo automtico, incluso antes de llamar al constructor (false para boolean, el carcter nulo para char y cero para los tipos numricos). De todas formas, lo ms adecuado es inicializarlas tambin en el constructor.

 Las variables miembro pueden ir precedidas en su declaracin por uno de los modificadores de acceso: public, private, protected y package (que es el valor por defecto y puede omitirse).  Junto con los modificadores de acceso de la clase (public y package), determinan qu clases y mtodos van a tener permiso para utilizar la clase y sus mtodos y variables miembro.  Existen otros dos modificadores (no de acceso) para las variables miembro: 1. transient: indica que esta variable miembro no forma parte de la persistencia (capacidad de los objetos de mantener su valor cuando termina la ejecucin de un programa) de un objeto y por tanto no debe ser serializada (convertida en flujo de caracteres para poder ser almacenada en disco o en una base de datos) con el resto del objeto. 2. volatile: indica que esta variable puede ser utilizada por distintas threads sincronizadas (ver Apartado 6.3, en la pgina 131) y que el compilador no debe realizar optimizaciones con esta variable.

Variables miembro de clase (static)  Una clase puede tener variables propias de la clase y no de cada objeto. A estas variables se les llama variables de clase o variables static. Las variables static se suelen utilizar para definir constantes comunes para todos los objetos de la clase (por ejemplo PI en la clase Circulo) o variables que slo tienen sentido para toda la clase (por ejemplo, un contador de objetos creados como numCirculos en la clase Circulo).  Las variables de clase son lo ms parecido que Java tiene a las variables globales de C/C++. Las variables de clase se crean anteponiendo la palabra static a su declaracin. Para llamarlas se suele utilizar el nombre de la clase (no es imprescindible, pues se puede utilizar tambin el nombre de cualquier objeto), porque de esta forma su sentido queda ms claro. Por ejemplo, Circulo.numCirculos es una variable de clase que cuenta el nmero de crculos creados.

 Si no se les da valor en la declaracin, las variables miembro static se inicializan con los valores por defecto para los tipos primitivos (false para boolean, el carcter nulo para char y cero para los tipos numricos), y con null si es una referencia.  Las variables miembro static se crean en el momento en que pueden ser necesarias: cuando se va a crear el primer objeto de la clase, en cuanto se llama a un mtodo static o en cuanto se utiliza una variable static de dicha clase. Lo importante es que las variables miembro static se inicializan siempre antes que cualquier objeto de la clase.

Variables Finales  Una variable de un tipo primitivo declarada como final no puede cambiar su valor a lo largo de la ejecucin del programa. Puede ser considerada como una constante, y equivale a la palabra const deC/C++.  Java permite separar la definicin de la inicializacin de una variable final. La inicializacin puede hacerse ms tarde, en tiempo de ejecucin, llamando a mtodos o en funcin de otros datos.  La variable final as definida es constante (no puede cambiar), pero no tiene por qu tener el mismo valor en todas las ejecuciones del programa, pues depende de cmo haya sido inicializada.  Adems de las variables miembro, tambin las variables locales y los propios argumentos de un mtodo pueden ser declarados final.  Declarar como final un objeto miembro de una clase hace constante la referencia, pero no el propio objeto, que puede ser modificado a travs de otra referencia. En Java no es posible hacer que un objeto sea constante.

MTODOS (FUNCIONES MIEMBRO) Mtodos de objeto  Los mtodos son funciones definidas dentro de una clase. 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 pueden adems tener otros argumentos explcitos que van entre parntesis, a continuacin del nombre del mtodo.  La primera lnea de la definicin de un mtodo se llama declaracin o header; el cdigo comprendido entre las llaves {} es el cuerpo o body del mtodo. Considrese el siguiente mtodo omado de la clase Circulo: public Circulo elMayor(Circulo c) { // header y comienzo del mtodo if (this.r>=c.r) // body return this; // body else // body return c; // body } // final del mtodo

 El header consta del cualificador de acceso (public, en este caso), del tipo del valor de retorno (Circulo en este ejemplo, void si no tiene), del nombre de la funcin y de una lista de argumentos explcitos entre parntesis, separados por comas. Si no hay argumentos explcitos se dejan los parntesis vacos.  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 (.). De todas formas, tambin se puede acceder a ellas mediante la referencia this, de modo discrecional (como en el ejemplo anterior con this.r) o si alguna variable local o argumento las oculta.  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 ser 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 sub-clase, pero nunca de una superclase

 Los mtodos pueden definir variables locales. Su visibilidad llega desde la definicin al finaldel bloque en el que han sido definidas. No hace falta inicializar las variables locales en el punto en que se definen, 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 (Ej: public native void miMetodo();) no hay que incluir el cdigo o implementacin del mtodo. Este cdigo deber estar en una librera dinmica (Dynamic Link Library o DLL). Estas libreras son ficheros de funciones compiladas normalmente en lenguajes distintos de Java (C, C++, Fortran, etc.). Es la forma de poder utilizar conjuntamente funciones realizadas en otros lenguajes desde cdigo escrito en Java.  Un mtodo tambin puede declararse como synchronized (Ej: public synchronized double miMetodoSynch(){...}). Estos mtodos tienen la particularidad de que sobre un objeto no pueden ejecutarse simultneamente dos mtodos que estn sincronizados

Mtodos parame trisados  Al igual que C++, Java permite mtodos parame trisados es decir, mtodos distintos que tienen el mismo nombre, pero que se diferencian por el nmero y/o tipo de los argumentos.  A la hora de llamar a un mtodo sobrecargado, Java mtodo concreto que debe llamar: sigue unas reglas para determinar el mtodo concreto que debe llamar:

1. Si existe el mtodo cuyos argumentos se ajustan exactamente al tipo de los argumentos de la llamada (argumentos actuales), se llama ese mtodo. 2. Si no existe un mtodo que se ajuste exactamente, se intenta promover los argumentos actuales al tipo inmediatamente superior (por ejemplo char a int, int a long, float a double, etc.) y se llama el mtodo correspondiente.

Si slo existen mtodos con argumentos de un tipo ms restringido (por ejemplo, int en vez de long), el programador debe hacer un cast responsabilizndose de esta manera de lo que pueda ocurrir explcito en la llamada. 4. El valor de retorno no influye en la eleccin del mtodo sobrecargado. En realidad es imposible saber desde el propio mtodo lo que se va a hacer con l. No es posible crear dos mtodos sobrecargados, es decir con el mismo nombre, que slo difieran en el valor de retorno.  Diferente de la sobrecarga de mtodos es la redefinicin. Una clase puede redefinir (override) un mtodo heredado de una superclase. Redefinir un mtodo es dar una nueva definicin.  En este caso el mtodo debe tener exactamente los mismos argumentos en tipo y nmero que el mtodo redefinido

3.

Paso de argumentos a mtodos  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 queda 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 otros 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. Dentro de un mtodo se pueden crear variables locales de los tipos primitivos o referencias.

 Estas variables locales dejan de existir al terminar la ejecucin del mtodo1. Los argumentos formales de un mtodo (las variables que aparecen en el header del mtodo para recibir el valor delos argumentos actuales) tienen categora de variables locales del mtodo.  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: String numeroComoString = 8.978; float p = Float.valueOf(numeroComoString).floatValue();  Donde el mtodo valueOf(String) de la clase java.lang.Float devuelve un objeto de la clase Float sobre el que se aplica el mtodo floatValue(), que finalmente devuelve una variable primitiva de tipo float.

 El ejemplo anterior se poda desdoblar en las siguientes sentencias: String numeroComoString = 8.978; Float f = Float.valueOf(numeroComoString); float p = f.floatValue();  Obsrvese que se pueden encadenar varias llamadas a mtodos por medio del operador punto (.) que, como todos los operadores de Java excepto los de asignacin, se ejecuta de izquierda a derecha

Mtodos de clase (static)  Anlogamente, puede tambin haber mtodos que no acten sobre objetos concretos a travs del operador punto. A estos mtodos se les llama mtodos de clase o static. Los mtodos de clase pueden recibir objetos de su clase como argumentos explcitos, pero no tienen argumento implcito ni pueden utilizar la referencia this. Un ejemplo tpico de mtodos static son los mtodos matemticos de la clase java.lang.Math (sin(), cos(), exp(), pow(), etc.). De ordinario el argumento de estos mtodos ser de un tipo primitivo y se le pasar como argumento explcito. Estos mtodos no tienen sentido como mtodos de objeto.  Los mtodos y variables de clase se crean anteponiendo la palabra static. Para llamarlos se suele utilizar el nombre de la clase, en vez del nombre de un objeto de la clase (por ejemplo,Math.sin(ang), para calcular el seno de un ngulo).

Constructores  Un punto clave de la Programacin Orientada Objetos es el evitar informacin incorrecta por no haber sido correctamente inicializadas las variables. Java no permite que haya variables miembro que no estn inicializadas (S puede haber variables locales de mtodos sin inicializar, pero el compilador da un error si se intentan utilizar sin asignarles previamente un valor). Ya se ha dicho que Java inicializa siempre con valores por defecto las variables miembro de clases y objetos. El segundo paso en la inicializacin correcta de objetos es el uso de constructores.  Un constructor es un mtodo que se llama automticamente cada vez que se crea un objeto de una clase. La principal misin del constructor miembro de la clase. es reservar memoria e inicializar las variables.  Los constructores no tienen valor de retorno (ni siquiera void) y su nombre es el mismo que el de la clase. Su argumento implcito es el objeto que se est creando.

 De ordinario una clase tiene varios constructores, que se diferencian por el tipo y nmero de sus argumentos (son un ejemplo tpico de mtodos sobrecargados). Se llama constructor por defecto al constructor que no tiene argumentos. El programador debe proporcionar en el cdigo valores iniciales adecuados para todas las variables miembro.  Un constructor de una clase 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 laprimera sentencia de un constructor.  El constructor de una sub-clase puede llamar al constructor de su super-clase 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 constructor es tan importante que, si el programador no prepara ningn constructor para una clase, el compilador crea un constructor por defecto, inicializando las variables de los tipos primitivos a su valor por defecto, y los Stringsy las dems referencias a objetos a null. Si hace falta, se llama al constructor de la superclase para que inicialice las variables heredadas  Al igual que los dems mtodos de una clase, los constructores pueden tener tambin los modificadores de acceso public, private, protected y package. Si un constructor es private, ninguna otra clase puede crear un objeto de esa clase. En este caso, puede haber mtodos public y static (factory methods) que llamen al constructor y devuelvan un objeto de esa clase.  Dentro de una clase, los constructores slo pueden ser llamados por otros constructores o por mtodos static. No pueden ser llamados por los mtodos de objeto de la clase.

Inicializadores  Java todava dispone de una tercera lnea de actuacin para evitar que haya variables sin inicializar correctamente. Son los inicializadores, que pueden ser static (para la clase) o de objeto.  Inicializadores static Un inicializador static es un algo parecido a un mtodo (un bloque {} de cdigo, sin nombre y sin argumentos, precedido por la palabra static) que se llama automticamente al crear la clase (al utilizarla por primera vez). Tambin se diferencia del constructor en que no es llamado para cada objeto, sino una sola vez para toda la clase. Los tipos primitivos pueden inicializarse directamente con asignaciones en la clase o en el constructor, pero para inicializar objetos o elementos ms complicados es bueno utilizar un inicializador (un bloque de cdigo {}), ya que permite gestionar excepciones(Las excepciones son situaciones de error o, en general, situaciones anmalas que puede exigir ciertas actuaciones del propio programa o del usuario) con trycatch.

 Los inicializadores static se crean dentro de la clase, como mtodos sin nombre, sin argumentos y sin valor de retorno, con tan slo la palabra static y el cdigo entre llaves {...}. En una clase pueden definirse varios inicializadores static, que se llamarn en el orden en que han sido definidos.  Los inicializadores static se pueden utilizar para dar valor a las variables static. Adems se suelen utilizar para llamar a mtodos nativos, esto es, a mtodos escritos por ejemplo en C/C++ (llamando a los mtodos System.load() o System.loadLibrary(), que leen las libreras nativas). Por ejemplo: o static{ System.loadLibrary("MyNativeLibrary"); }

 Inicializadores de objeto A partir de Java 1.1 existen tambin inicializadores de objeto, que no llevan la palabra static. Se utilizan para las clases annimas, que por no tener nombre no pueden tener constructor. En este caso, los inicializadores de objeto se llaman cada vez que se crea un objeto de la clase annima.

Resumen del proceso de creacin de un objeto  El proceso de creacin de objetos de una clase es el siguiente: 1. Al crear el primer objeto de la clase o al utilizar el primer mtodo o variable static se localiza la clase y se carga en memoria. 2. Se ejecutan los inicializadores static (slo una vez). 3. Cada vez que se quiere crear un nuevo objeto: 1) Se comienza reservando la memoria necesaria. 2) Se da valor por defecto a las variables miembro de los tipos primitivos . 3) Se ejecutan los inicializadores de objeto se ejecutan los constructores

Destruccin de objetos (liberacin de memoria)  En Java no hay destructores 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.  La esta caracterstica 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. Como ya se ha dicho, una forma de hacer que un objeto quede sin referencia es cambiar sta a null, haciendo por ejemplo:  ObjetoRef = null;

 En Java no se sabe exactamente cundo se va a activar el garbage collector.  Se puede llamar explcitamente al garbage collector con el mtodo System.gc(), aunque esto es considerado por el sistema slo como una sugerencia a la JVM.

Finalizadores  Los finalizadores son mtodos que vienen a completar la labor del garbage collector.

 Un finalizador es un mtodo que se llama automticamente cuando se va a destruir un objeto (antes de que la memoria sea liberada de modo automtico por el sistema). Se utilizan para ciertas operaciones de terminacin distintas de liberar memoria (por ejemplo: cerrar ficheros, cerrar conexiones de red, liberar memoria reservada por funciones nativas, etc.).  Hay que tener en cuenta que el garbage collector 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 de objeto (no static), 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 super-clase.  Tampoco se puede saber el momento preciso en que los finalizadores van a ser llamados. En muchas ocasiones ser conveniente que el programador realice esas operaciones de finalizacin de modo explcito mediante otros mtodos que l mismo llame.  El mtodo System.runFinalization() sugiere a la JVM que ejecute los finalizadores de los objetos pendientes (que han perdido la referencia). Para que este mtodo se ejecute, en Java 1.1 hay que llamar primero a gc() y luego a runFinalization()

Qu es un package  Un package es una agrupacin de clases. En la API de Java 1.1 haba 22 packages; en Java 1.2 hay 59 packages, lo que da una idea del crecimiento experimentado por el lenguaje.  Adems, el usuario puede crear sus propios packages. Para que una clase pase a formar parte de un package llamado pkgName, hay que introducir en ella la sentencia:  package pkgName;  Que debe ser la primera sentencia del fichero sin contar comentarios y lneas en blanco.  Los nombres de los packages se suelen escribir con minsculas, para distinguirlos de las clases, que empiezan por mayscula. El nombre de un package puede constar de varios nombres unidos por puntos (los propios packages de Java siguen esta norma, como por ejemplo java.awt.event).

 Todas las clases que forman parte de un package deben estar en el mismo directorio.  Los nombres compuestos de los packages estn relacionados con la jerarqua de directorios en que se guardan las clases. Es recomendable que los nombres de las clases de Java sean nicos en Internet. Es el nombre del package lo que permite obtener esta caracterstica.  Una forma de conseguirlo es incluir el nombre del dominio (quitando quizs el pas), como por ejemplo en el package siguiente:  es.ceit.jgjalon.infor2.ordenar  Las clases de un package se almacenan en un directorio con el mismo nombre largo (path) que el package. Por ejemplo, la clase, es.ceit.jgjalon.infor2.ordenar.QuickSort.class debera estar en el directorio, CLASSPATH\es\ceit\jgjalon\infor2\ordenar\QuickSort.class donde CLASSPATH es una variable de entorno del PC que establece la posicin absoluta de los directorios en los que hay clases de Java (clases del sistema o de usuario).

 En este caso la posicin del directorio es en los discos locales del ordenador.  Los packages se utilizan con las finalidades siguientes: 1. Para agrupar clases relacionadas. 2. Para evitar conflictos de nombres (se recuerda que el dominio de nombres de Java es la Internet). En caso de conflicto de nombres entre clases importadas, el compilador obliga a cualificar en el cdigo los nombres de dichas clases con el nombre del package. 3. Para ayudar en el control de la accesibilidad de clases y miembros.

Cmo funcionan los packages  Con la sentencia import packname; se puede evitar tener que utilizar nombres muy largos, al mismo tiempo que se evitan los conflictos entre nombres.  Si a pesar de todo hay conflicto entre nombres de clases, Java da un error y obliga a utilizar los nombres de las clases cualificados con el nombre del package.  El importar un package no hace que se carguen todas las clases del package: slo se cargarn las clases public que se vayan a utilizar.  Al importar un package no se importan los sub-packages.  stos deben ser importados explcitamente, pues en realidad son packages distintos. Por ejemplo, al importar java.awt no se importa java.awt.event.

 Se importan por defecto el package java.lang y el package actual o por defecto (las clases del directorio actual).  Existen dos formas de utilizar import: para una clase y para todo un package:  import es.ceit.jgjalon.infor2.ordenar.QuickSort.class;  import es.ceit.jgjalon.infor2.ordenar.*;  Que deberan estar en el directorio:  classpath\es\ceit\jgjalon\infor2\ordenar

 Es posible guardar en jerarquas de directorios diferentes los ficheros *.class y *.java, con objeto por ejemplo de no mostrar la situacin del cdigo fuente. Los packages hacen referencia a los ficheros compilados *.class.  En un programa de Java, una clase puede ser referida con su nombre completo (el nombre del package ms el de la clase, separados por un punto).  Tambin se pueden referir con el nombre completo las variables y los mtodos de las clases.  Esto se puede hacer siempre de modo opcional, pero es incmodo y hace ms difcil el reutilizar el cdigo y portarlo a otras mquinas.  La sentencia import permite abreviar los nombres de las clases, variables y mtodos, evitando el tener que escribir continuamente el nombre del package importado.

Вам также может понравиться