Beruflich Dokumente
Kultur Dokumente
NDICE
1. INTRODUCCIN.......................................................................................... 5 2. CLASES Y OBJETOS.................................................................................. 6 2.1. 2.2. 2.3. 2.4. DEFINICIN DE UNA CLASE JAVA .............................................................. 6 CREACIN DE OBJETOS ........................................................................... 8 MTODOS Y ATRIBUTOS ESTTICOS ......................................................... 9 CONSTRUCTORES ................................................................................. 11
2.4.1. Sobrecarga de constructores ......................................................... 13 2.4.2. Constructores por defecto .............................................................. 13 2.5. EMPAQUETADO E IMPORTACIN DE CLASES............................................ 14 EJERCICIO 1...................................................................................... 15 3. EL API JAVA SE........................................................................................ 17 3.1. 3.2. JAVADOC .............................................................................................. 17 CLASES PARA GESTIN DE CADENAS Y NMEROS. .................................. 18
3.2.1. Clase String.................................................................................... 18 3.2.1.1. Mtodos de la clase String....................................................... 19 EJERCICIO 2...................................................................................... 20 EJERCICIO 3...................................................................................... 20 3.2.2. La clase StringBuilder .................................................................... 22 3.2.2.1. Mtodos de la clase StringBuilder ........................................... 23 EJERCICIO 4...................................................................................... 23 3.2.3. La clase Math................................................................................. 24 3.2.3.1. Importaciones estticas ........................................................... 24 3.2.3.2. Principales mtodos de Math................................................... 25 EJERCICIO 5...................................................................................... 25 3.2.4. Clases de envoltorio....................................................................... 26 3.2.4.1. Creacin de un objeto de envoltorio ........................................ 26
3.3.1. La clase PrintStream ...................................................................... 28 3.3.1.1. Obtencin de un objeto PrintStream........................................ 28 3.3.1.2. Envio de informacin a la salida .............................................. 28 3.3.1.3. Salida con formato ................................................................... 28 3.3.2. La clase Console............................................................................ 29 3.3.2.1. Obtencin de un objeto Console.............................................. 29 3.3.2.2. Mtodos de la clase Console................................................... 29 EJERCICIO 6...................................................................................... 30 3.3.3. La clase BufferedReader ............................................................... 30 3.3.3.1. Creacin de un objeto BufferedReader ................................... 30 3.3.3.2. Recuperacin de datos ............................................................ 31 EJERCICIO 7...................................................................................... 32 3.3.4. La clase Scanner ........................................................................... 32 3.3.4.1. Creacin de un objeto Scanner ............................................... 33 3.3.4.2. Mtodos de la clase Scanner................................................... 33 EJERCICIO 8...................................................................................... 33 3.4. CLASES DE COLECCIN ......................................................................... 34
3.4.1. Tipos de colecciones...................................................................... 34 3.4.2. Colecciones basadas en ndices.................................................... 34 3.4.2.1. Mtodos para la manipulacin de la coleccin ........................ 35 EJERCICIO 9...................................................................................... 36 3.4.3. Colecciones de tipo genrico ......................................................... 39 EJERCICIO 10.................................................................................... 40 3.4.4. Colecciones basadas en claves ..................................................... 42 3.4.4.1. Mtodos de la clase Hashtable................................................ 43 EJERCICIO 11.................................................................................... 45
3.4.5. Conjuntos ....................................................................................... 47 3.4.5.1. Mtodos de HashSet ............................................................... 47 3.4.6. Colas .............................................................................................. 48 3.4.6.1. Mtodos de PriorityQueue ....................................................... 48
1.
INTRODUCCIN
Adems de ser un potente lenguaje de programacin, la plataforma Java proporciona a los programadores un sinfn de clases que les ayudarn a resolver prcticamente cualquier problema que se le pueda plantear. Como ya indicamos en el tema anterior, todo este compendio de clases, conocido tambin como el API de Java, se encuentra organizado en tres grandes bloques: Java estndar (Java SE), Java Enterprise (Java EE) y Java micro (Java ME). A lo largo de este tema vamos a estudiar algunas de las clases de uso general del Java SE, clases que nos van a ayudar a resolver problemas habituales con los que nos vamos a encontrar en cualquier tipo de aplicacin. Antes de abordar este estudio, es necesario que aclaremos una serie de conceptos importantes sobre clases y objetos que, no slo nos facilitarn la comprensin de las clases del API Java, sino que nos permitirn tambin ir estructurando poco a poco nuestros programas de una forma ms adecuada. Posteriormente, en el tema 3, analizaremos en profundidad los conceptos de la programacin orientada a objetos y su aplicacin en el lenguaje Java.
2.
CLASES Y OBJETOS
Como ya sabemos por el tema anterior, todo programa Java se estructura en clases. Pero, qu es exactamente una clase? Desde un punto de vista conceptual, una clase define el comportamiento de un determinado tipo de elemento. Y se trata simplemente de eso, de un conjunto de especificaciones que determinan como se van a comportar cierto tipo de elementos. Estos elementos, creados a partir de las especificaciones de la clase, es lo que llamamos objetos. En el mundo real podemos encontrar numerosos ejemplos al respecto. Por ejemplo, cuando hablamos de un coche nos estamos refiriendo a un determinado tipo de elementos con una funcionalidad especfica, es decir, sirven para desplazarnos de un lugar a otro, se caracterizan por una serie de atributos como potencia, color, etc.; el concepto de coche sera pues una clase, caracterizada por una serie de atributos y funcionalidades. Pero en el momento que pensamos en un coche especfico existente con una determinada matrcula, entonces estaramos hablando ya de objeto. En resumen, la clase define el comportamiento y caractersticas de cierto tipo de elementos, mientras que los elementos fsicos, creados a partir de las especificaciones de la clase, seran los objetos. En programacin las clases contienen el cdigo que define el comportamiento de los tipos de objeto que representan. Este cdigo est dividido en dos partes: Atributos. Representan las caractersticas que tendrn los objetos de la clase, como el color, precio, potencia, etc.. Normalmente, los atributos son manejados a travs de variables internas de la clase. Mtodos. Se trata de funciones que implementan la funcionalidad de los objetos de la clase. En el caso de una hipottica clase coche, algunos de los mtodos que determinan el funcionamiento de los mismos seran acelerar o frenar.
2.1.
En Java, como ya sabemos, las clases se implementan mediante la palabra reservada class, incluyendo en su interior un bloque de sentencias con los atributos y mtodos que la definen. La estructura tpica de una clase se indica en el siguiente listado: class Nombre_clase{ private tipo atributo1; private tipo atributo2; : public tipo metodo1(tipo parmetro,...){
} : } Los atributos de una clase Java se definen a travs de variables de mbito privado, es decir, variables que nicamente pueden ser utilizadas desde el interior de la clase. Por su parte, los mtodos estarn implementados mediante funciones, las cuales podrn devolver o no un valor, en funcin de la naturaleza del mtodo, y podrn recibir parmetros. El formato de un mtodo o funcin Java es el que se indica a continuacin: tipo_devolucion nombre_metodo (tipo parametro1, tipo parametro2){ //cuerpo del mtodo } Donde tipo_devolucion es el tipo de dato del valor devuelto por el mtodo, debindose indicar la palabra void si el mtodo no va a devolver ningn resultado. Por su parte, nombre_metodo representa el nombre asignado al mtodo y que deber seguir las mismas reglas que los nombres de clases. Entre los parntesis que se indican a continuacin del nombre del mtodo se declaran los parmetros que sern recibidos durante la llamada al mtodo; en caso de no recibir ningn parmetro se indicarn los parntesis vacos. A fin de que, una vez creado el objeto de la clase, los mtodos del mismo puedan ser utilizados desde cualquier parte del cdigo, se debe utilizar el modificador de acceso public en la declaracin de los mismos. En la figura 1 tenemos una sencilla definicin de la clase Coche en versin Java.
Definicin de la clase
Atributos
class Coche{ private int potencia; private String color; public void acelerar(){ //cdigo del mtodo acelerar } public void frenar(){ //cdigo del mtodo frenar } }
Mtodos
Figura. 1.
Como vemos en el listado anterior, los atributos de una clase deben ser declarados siempre como private, a fin de que el acceso a los mismos solo pueda realizarse desde el interior de la clase (este concepto, conocido como encapsulacin, ser tratado en profundidad durante el tema siguiente). Si queremos proporcionar acceso a los atributos desde el exterior de la clase, habr que hacerlo a travs de mtodos pblicos que proporcionen un acceso controlado a los mismos. Por cada uno de los atributos habr que proporcionar una pareja de mtodos, conocidos como mtodos set/get, que nos permitan realizar las operaciones de escritura y lectura, respectivamente, sobre los atributos. Por ejemplo, para que se pudiera tener acceso al atributo potencia desde el exterior de la clase Coche habra que incluir en la misma la siguiente pareja de mtodos: public } public void setPotencia(int p){ if(p>0){ //asigna al atributo el valor recibido como parmetro potencia=p; } } Como se puede apreciar, el mtodo setPotencia() ofrece un acceso controlado al atributo, evitando que se pueda asignar un valor negativo al mismo. El ejemplo de la figura 1 nos muestra un caso de clase Java que representa un tipo de objeto del mundo real, aunque no todas las clases utilizadas en programacin son tan intuitivas como esta. Determinar a partir de las especificaciones de un programa las clases en las que ste se debe estructurar y los mtodos y atributos de cada una de ellas no es tarea fcil, dado que no existen reglas fijas que establezcan como debe hacerse esta divisin int getPotencia(){
return potencia;
2.2.
CREACIN DE OBJETOS
Una vez implementada la clase, ya est lista para poder ser utilizada por los programas. Con la inclusin de atributos y mtodos dentro de una clase conseguimos que toda esta funcionalidad, definida en un nico lugar, pueda reutilizarse tantas veces como sea necesario en cualquier parte del programa. La utilizacin de la funcionalidad de una clase requiere la creacin de un objeto o instancia de la misma. Este objeto ser referenciado a travs de una variable con la que podremos llamar a los mtodos definidos dentro de la clase. La creacin de un objeto a partir de la clase se realiza utilizando el operador new : Tipo variable = new Tipo(); En este contexto, Tipo representa el nombre de la clase a partir de la que queremos crear el objeto. Por ejemplo, para crear un objeto de la clase Coche sera: Coche c = new Coche();
La instruccin anterior creara un objeto de la clase Coche y almacenara una referencia al mismo en la variable c, con la que podramos llamar a los distintos mtodos definidos en la misma utilizando el operador punto (.) : c.setPotencia(130); c.acelerar(); Las instancias u objetos creados son almacenados en memoria. Este espacio de memoria incluye adems de los mtodos una copia de cada uno de los atributos de la clase para ese objeto. Es importante indicar que, a diferencia de lo que sucede con los tipos primitivos Java donde la asignacin de un valor en una variable implica almacenar en esta el dato en s, cuando se asigna un objeto a una variable lo que se almacena en esta no es el objeto sino una referencia al mismo (figura 2).
varnum
10
Instancia de Coche
ob
Figura. 2.
Este hecho tiene implicaciones cuando se asigna una variable objeto a otra, por ejemplo, cuando se hace la llamada a un mtodo que recibe como parmetro un tipo objeto. En estos casos, la variable destino no recibira una copia del objeto sino de la referencia al mismo, lo que implica que tendramos dos variables apuntando al mismo objeto.
2.3.
Segn se acaba de explicar, se necesita crear un objeto de una clase para invocar a los mtodos de esta. Esto es as porque al hacer la llamada a los mtodos las instrucciones se ejecutan sobre este, por ejemplo, cuando invocamos al mtodo setPotencia() para asignar un valor de potencia al objeto, este dato se graba en la copia del atributo potencia reservada para ese objeto. Pero no todos los mtodos definidos en una clase dependen de los atributos de la clase; es posible definir ciertos mtodos cuyo funcionamiento no est vinculado a un objeto
particular de la clase, produciendo para todos ellos el mismo resultado. A este tipo de mtodos se les conoce como mtodos estticos y son definidos con la palabra static. En el siguiente listado tenemos un sencillo ejemplo de mtodo esttico: class Calculadora{ public static int suma(int a, int b){ return a+b; } } Como vemos, el mtodo suma no hace uso de ningn atributo de la clase para realizar su funcin, tan solo depende de los parmetros recibidos. La ventaja de los mtodos estticos es que no se necesita crear ningn objeto de la clase para poderlo llamar (con el consiguiente ahorro de memoria), basta con indicar el nombre de la clase delante del nombre del mtodo: Calculadora.suma(3, 6); Al ser independientes de los objetos, los mtodos estticos no pueden hacer uso de los atributos de la clase ni tampoco de otros mtodos no estticos de la misma ya que stos son especficos de cada objeto de la clase. Por ejemplo, el siguiente cdigo no compilara: class Calculadora{ private int x; public void imprime(){ //mtodo no esttico } public static int suma(int a, int b){ imprime(); //error no puede hacer uso de imprime return a+b+x; //error, no puede hacer uso de x } } De esta forma, si tuviramos la necesidad de compartir informacin entre dos mtodos estticos existentes en la misma clase deberamos recurrir a atributos estticos. Un atributo esttico (conocido tambin como variable de clase) es un atributo cuyo valor no est vinculado a un objeto particular de la clase, debindose declarar tambin con el modificador static: class Calculadora{ private static int x; public static void factor(int p) x=p; } public static int suma(int a, int b){ return a+b+x; }
} En muchas ocasiones, ciertos atributos estticos suelen estar adems declarados como public a fin de que se pueda tener acceso a los mismos desde el exterior de la clase: class Operaciones{ public static int op; : } Operaciones.op = 20; //acceso a un atributo esttico pblico. En el tema anterior ya vimos algunos ejemplo de atributos y mtodos pblicos estticos en clases de Java estndar. Uno de estos casos es el atributo out de la clase System, el cual contiene una referencia al stream de salida estndar (consola).
2.4.
CONSTRUCTORES
Normalmente, los objetos de una clase requieren que parte de sus atributos sean inicializados con una valor antes de poder llamar a los mtodos del mismo. Por ejemplo, supongamos que tenemos la siguiente versin de la clase Calculadora con un mtodo que nos permite calcular potencias de un nmero elevado a otro dado: public class Calculadora { private int exponente; public void setExponente(int exp){ exponente=exp; } public double potencia(int base){ double resultado=1; for(int i=1;i<=exponente;i++){ resultado*=base; } return resultado; } } Dado que el exponente est definido como un atributo de la clase, ser necesario establecer un valor en el mismo antes de llamar al mtodo potencia() encargado de realizar el clculo. Por ejemplo: Calculadora c=new Calculadora(); c.setExponente(5); System.out.println("3 elevado a 5 es "+c.potencia(3)); La incomodidad que supone llamar explcitamente a los mtodos de inicializacin de atributos puede ser eliminada gracias a la utilizacin de los constructores.
Un constructor es un bloque de instrucciones definidas en una clase que son ejecutadas cada vez que se crear un objeto de la misma. Las reglas que se deben de tener en cuenta a la hora de definir un constructor son las siguientes: Un constructor debe ser definido con un nombre que debe ser igual al nombre de la clase. Un constructor puede recibir parmetros. Un constructor no devuelve ningn resultado. Un constructor puede ser declarado con cualquier modificador de acceso, aunque solo si se define como public ser posible crear objetos de la clase desde el exterior de la misma.
As pues, el formato de un constructor tendr el aspecto indicado: public nombre_clase (tipo param1, tipo param2..){ //instrucciones } Dado que sus instrucciones se ejecutan en el momento de crear el objeto, los constructores son el lugar ideal para la inclusin de instrucciones de inicializacin de atributos. Por ejemplo, podramos aadir un constructor a la clase Calculadora anterior segn se indica en el siguiente listado: public class Calculadora { private int exponente; public Calculadora(int exp){ exponente=exp; } public void setExponente(int exp){ exponente=exp; } public double potencia(int base){ double resultado=1; for(int i=1;i<=exponente;i++){ resultado*=base; } return resultado; } } En la misma instruccin de creacin del objeto, se debe especificar entre parntesis el valor del argumento o argumentos de llamada al constructor: Calculadora c=new Calculadora(5); System.out.println("3 elevado a 5 es "+c.potencia(3));
2.4.1. Sobrecarga de constructores Gracias a una caracterstica de los lenguajes orientados a objetos, conocida como sobrecarga, y que ser estudiada en profundidad en el siguiente tema, es posible definir ms de un constructor dentro de una clase. Dado que todos los constructores tienen el mismo nombre, para que el compilador pueda detectar que constructor se emplea en cada momento ser requisito imprescindible que cada constructor se diferencie de los restantes en el tipo y/o nmero de parmetros. Por ejemplo, dentro de la clase Calculadora podran convivir los siguientes constructores: public Calculadora(){ exponente=1; } public Calculadora(int exp){ exponente=exp; } public Calculadora(int exp1, int exp2){ exponente=exp1+exp2; } Cada un proporciona una forma diferente de inicializar los atributos de la clase; es en el momento de crear el objeto cuando se decide que constructor utilizar en funcin de los parmetros utilizados: Calculadora c = new Calcualdora(); //utiliza el primer //constructor Calculadora c1 = new Calcualdora(3); //utiliza el segundo //constructor Calculadora c2 = new Calcualdora(4, 6); //utiliza el tercer //constructor 2.4.2. Constructores por defecto Toda clase definida en Java debe de tener al menos un constructor. En caso de que el programador no proporcione ninguno de manera explcita, el compilador crear el llamado constructor por defecto que no es ms que un constructor sin parmetros y sin cdigo: public Nombre_clase(){ } El objeto de incluir este constructor no es otro que permitir la creacin de objetos de la clase. Es importante tener en cuenta que este constructor solo es aadido por el compilador en caso de que la clase no cuente con ninguno definido de forma explcita, como ocurra por ejemplo en la primera versin que hicimos de la clase Calculadora. Sin embargo, en la siguiente versin que presentamos donde incluamos un constructor con un parmetro para la inicializacin del exponente, el constructor por defecto no se crea, por lo que una operacin como esta:
Calculadora c = new Calculadora(); provocara un error de compilacin al no disponer la clase de constructores sin parmetros.
2.5.
Segn vimos en el tema 1, las clases Java se organizan en paquetes. Para incluir una clase dentro de un determinado paquete debemos utilizar la sentencia package durante la definicin de la clase: package nombre_paquete; class Nombre_clase{ : } Por otro lado, cuando desde el cdigo fuente de una clase se quiere hacer uso de otra clase que se encuentra en una paquete diferente, podemos seguir dos caminos: Utilizar el nombre cualificado de la clase. El nombre cualificado de una clase est formado por el nombre de sta precedido por los nombres de los paquetes y subpaquetes en donde se encuentra. Por ejemplo, si la clase Operaciones estuviera definida de la siguiente manera: package : } y quisiramos declarar una variable de tipo Operaciones en otra clase situada en un paquete diferente a sta, deberamos utilizar: nivel1.nivel2.Operaciones op; Importar la clase. En muchos casos la utilizacin de nombres cualificados para hacer referencia a una clase puede resultar muy incomodo. Como alternativa, se puede importar la clase al principio del archivo de cdigo fuente de la clase destino utilizando la sentencia import. De esta forma, para poder referirse a la clase ser suficiente con utilizar el nombre simple de la misma. Por ejemplo, si quisiramos declarar una variable de la clase Operaciones desde otra clase llamada Principal situada en otro paquete diferente, utilizando la importacin de clases, sera: import nivel1.nivel2.Operaciones; class Principal{ Operaciones op; //utilizacin de la clase sin nombre //cualificado : } Si queremos hacer uso de varias clases situadas en el mismo paquete se puede realizar la importacin del paquete completo: nivel1.nivel2;
import nivel1.nivel2.*; De los ejemplos anteriores se desprende algo que es muy importante tener en cuenta cuando se va a trabajar con clases de distintos paquetes y es que, independientemente del camino seguido a la hora de utilizar una clase que se encuentra en un paquete diferente, dicha clase deber estar declarada como publica en el interior de su paquete. Este es el caso de la clase Operaciones que hemos declarado antes con el modificador public. Si no llevara dicho modificador, la clase no sera accesible fuera del paquete nivel2 en el que se ha declarado, es decir, solo podra ser utilizada por clases de su mismo paquete.
EJERCICIO 1
Como primer ejercicio del tema y para afianzar los conceptos sobre creacin de clases y objetos, vamos a desarrollar un programa que nos permita realizar clculos geomtricos (rea y permetro) sobre crculos. El programa recibir como argumento de la lnea de comandos el radio de un crculo y nos mostrar en pantalla el rea y permetro de la figura. Para ello, vamos a dividir el programa en dos clases; por un lado tendremos la clase Circulo que definir las operaciones sobre un crculo y por otro lado tendremos una clase a la que llamaremos Cliente que se encargar de recuperar el radio, crear el objeto Circulo y llamar a los mtodos del mismo, as como presentar los resultados en pantalla. El poder aislar las operaciones sobre el crculo en una clase independiente nos permite reutilizar esta clase en otros programas donde se requiera realizar este tipo de clculos, independientemente de cmo se obtenga el radio y donde se vayan a presentar los resultados. Por otro lado, la clase Circulo ser definida dentro de un paquete llamado figuras (figura 3) mientras que la clase Cliente estar en el paquete pruebas.
Figura. 3.
El cdigo de la clase Circulo se muestra en el siguiente listado: package figuras; public class Circulo { private int radio; public Circulo(){ radio=1; } public Circulo(int r){ radio=r; } public double area(){ return radio*radio*3.1416; } public double perimetro(){ return 2*3.1416*radio; } } Como vemos, se definen dos constructores en la clase: uno de ellos que inicializa el radio al valor 1 y el otro que permite especificar el valor del mismo durante la creacin de los objetos, independizando as la clase del mecanismo utilizado para la obtencin del radio. En cuanto a la clase Cliente, su cdigo ser el siguiente: package pruebas; import figuras.Circulo; public class Cliente { public static void main(String[] args) { int radio=Integer.parseInt(args[0]); Circulo c=new Circulo(radio); System.out.println("El rea vale: "+c.area()); System.out.println("El permetro vale: "+c.perimetro()); } } En este ejemplo se emplea el mtodo parseInt() de clase Integer para la conversin del radio obtenido desde la lnea de comandos en un valor numrico. Este mtodo ser presentado en el siguiente apartado dedicado al estudio de las clases del API Java.
3. EL API JAVA SE
La plataforma Java Estndar Edition incluye cientos de clases con las que el programador puede resolver problemas comunes de programacin, como el acceso a datos, la gestin de entrada/salida o la construccin de interfaces grficas. Entre esta clases se encuentran algunas cuyo conocimiento resulta imprescindible para resolver problemas bsicos de programacin que podemos encontrar en la mayora de aplicaciones. Dedicaremos lo que resta de tema al estudio de estas clases, para ello estableceremos la siguiente divisin en grupos: Gestin de cadenas y nmeros. Entrada / salida Colecciones
3.1.
JAVADOC
Antes de entrar a analizar las distintas clases que componen los grupos indicados, vamos a presentar uno de los instrumentos ms importantes con que cuenta un programador para obtener informacin sobre las clases que tiene que utilizar: los javadoc. Javadoc son los documentos donde se muestra la ayuda de las clases de Java. En el sitio Web de Sun Microsystem podemos encontrar los documentos javadoc de las clases oficiales de Java (estndar, enterprise y microedition), informacin sta que resulta imprescindible para el da a da de un programador. Concretamente, en la direccin http://java.sun.com/javase/6/docs/api/ encontramos los javadoc de las clases que forman parte del Java estndar. El aspecto de las pginas de ayuda del javadoc se muestra en la figura 4.
paquetes
miembros de la clase
clases
Figura. 4.
La pgina de ayuda est dividida en tres zonas: Paquetes. Representa la zona superior izquierda de la pgina. En ella se muestra la lista de todos los paquetes definidos, en el caso de Java SE, se trata de todos los paquetes de clases incluidos en esta edicin. Clases. Al seleccionar un paquete de la lista anterior, en esta zona se muestran todas las clases incluidas dentro de dicho paquete. Miembros de la clase. Se trata del rea principal de la ayuda. En esta zona se muestra, adems de una breve explicacin de la clase seleccionada en el rea de clases, la lista de todos los miembros incluidos en la misma agrupados por categoras (atributos pblicos -campos-, constructores y mtodos). Si se selecciona un miembro en concreto, se mostrar en esta misma zona una breve explicacin sobre el mismo.