Escolar Documentos
Profissional Documentos
Cultura Documentos
Introduccin La clase es el ncleo de Java. Es la construccin lgica sobre la que se construye el lenguaje Java, ya que define la forma y la naturaleza de un objeto. La clase constituye la base de la programacin orientada a objetos en Java. Cualquier concepto que se desee implementar en un programa Java debe ser encapsulado en una clase. TEMA 1 La POO en Java En los programas realizados hasta el momento se han utilizado clases, pero de la manera ms simple: Una clase que encapsula al mtodo main(), lo que ha permitido ilustrar las bases de la sintaxis de Java. Pero las clases son ms poderosas de lo visto hasta ahora. Lo ms importante acerca de una clase es que define un nuevo tipo de dato. Una vez definido, este nuevo tipo de dato se puede utilizar para crear objetos de ese tipo. Una clase es una plantilla para un objeto y un objeto es una instancia de una clase. Clases Cuando se define una clase, se declara su forma y naturaleza exacta. Esto se hace especificando los datos que contiene la clase y el cdigo que opera sobre ellos. Una clase se declara utilizando la palabra clave class. Una clase tiene la siguiente forma: Class NombreClase { tipo variable1; tipo variable2; ... tipo variableN; tipo metodo1(listaParametros){ ... } tipo metodo2(listaParametros){ ... } ... tipo metodoN(listaParametros){ ... } } Las variable definidas en una clase se llaman variables de instancia. Los subprogramas se denominan mtodos. Para objetos de una clase es necesario realizar dos pasos: Declarar una variable del tipo de la clase. La variable no define un objeto, sino una referencia a l. 1
Obtener una copia fsica y real objeto y asignarla a la variable. Para ello se utiliza el operador new. Este operador asigna dinmicamente en tiempo de ejecucin, memoria para un objeto y devuelve una referencia a este.
Por ejemplo, cuando decidimos utilizar la clase InputStreamReader, las instruccin fue: InputStreamReader isr=new InputStreamReader(System.in); La cual se puede dividir as InputStreamReader isr; //Se declara la referencia al objeto isr=new InputStreamReader(System.in); //Reserva espacio para el objeto Mtodos Java le da mucho poder y flexibilidad a los mtodos. Una de las caractersticas es que pueden devolver un tipo especfico de dato o de clase. Si no devuelve ningn valor el tipo devuelto debe ser void. La lista de parmetros es una secuencia de parejas de tipo e identificador separadas por coma. Los parmetros son variables que reciben el valor de los argumentos que se pasan al mtodo. Si el mtodo no tiene parmetros, entonces la lista estar vaca. Cuando el mtodo devuelve un tipo distinto de void, deben retornar un valor utilizando la instruccin return: return valor; Los mtodos definen la interfaz de la mayora de las clases. Esto permite que la clase oculte sus estructuras de datos internas detrs de un conjunto de mtodos. Adems de definir mtodo que proporcionan acceso a los datos, tambin pueden definirse mtodos que sern utilizados internamente por la propia clase. Un programa ejemplo: Rescribiendo una aplicacin utilizando POO El cdigo de la derecha permite calcular valor de una cuota en una deuda con base en el valor de prstamo, la tasa de inters y el nmero de perodos. (Fue descrito con anterioridad). En l se observa que no slo se atiende el problema del clculo de los resultados sino tambin de la entrada de datos. Esto dificulta un poco entender el programa. Aplicando la POO se podra pensar en dividir el problema en dos: La entrada de datos por consola El calculo del valor de la cuota. Para ello sera conveniente definir dos clases: Una que contenga los mtodos para la lectura de variables, no slo de valores reales, sino tambin de enteros y cadenas (para poder reutilizarla despus en otro programa). Una que contenga el mtodo principal, donde se calcule el valor de la cuota.
import java.io.*; public class Cuota{ public static void main(String args[]){ InputStreamReader isr=new InputStreamReader(System.in); BufferedReader br=new BufferedReader(isr); String texto; double p,i,n,a; System.out.println("Calculo del valor de una cuota:"); try{ System.out.print("Valor del Prstamo? "); texto=br.readLine(); Double d1=new Double(texto); p=d1.doubleValue(); System.out.print("Inters por perodo? "); texto=br.readLine(); Double d2=new Double(texto); i=d2.doubleValue()/100; System.out.print("Perodos? "); texto=br.readLine(); Double d3=new Double(texto); n=d3.doubleValue(); double factor=Math.pow(1+i,n); a=p*(factor*i)/(factor-1); System.out.print("Valor Cuota="+a); } catch (Exception e) { System.out.println("Error "+e); } }
Las magnitudes se calcularan as: Permetro = 2 r rea = r Volumen = r h La clase Circulo la definiramos as: class Circulo { double radio; public double perimetro(){ return 2*Math.PI*radio; } public double area(){ return Math.PI*Math.pow(radio,2); } } La clase Cilindro heredara la clase Circulo y quedara as: class Cilindro extends Circulo { double altura; public double volumen(){ return altura*area(); } } Observe como para calcular el volumen se utiliza el mtodo area() como si estuviera en la propia clase. El siguiente sera el cdigo para calcular el volumen de un cilindro, leyendo su altura y radio: public class PruebaCilindro{ public static void main(String args[]){ 4
Un ejemplo sencillo de applet sera: import java.applet.*; import java.awt.*; public class AppletHola extends Applet { public void paint(Graphics g){ g.drawString("Hola",10,20); } } Este ejemplo utiliza el mtodo paint(), invocado por el navegador del Web cuando el applet necesita ser dibujado. Este mtodo ejecuta una salida grfica, que en este caso es el texto hola. paint() utiliza un argumento que es un objeto de la clase Graphics. La clase Graphics es todo lo que se necesita para dibujar en Java. Para desplegar el applet , se necesita un archivo HTML que le haga referencia. <html> <head> <title>Applet</title> </head> <body> <applet code=AppletHola.class width=200 height=100> </applet> </body> </html> La etiqueta utilizada es la <APPLET></APPLET> la cual pide 3 parmetros: El nombre del archivo compilado (*.class) El ancho del rea de despliegue (WIDTH) El alto del rea de despliegue (HEIGHT) En el navegador, as se vera el applet:
Mtodos grficos bsicos Como se mencion anteriormente, un applet utiliza el mtodo drawString(), que es miembro de la clase Graphics. Normalmente este mtodo se utiliza en los mtodos update() y paint() del applet y tiene la siguiente sintaxis: public void drawString(String mensaje, int x, int y) Para darle color al fondo del applet se utiliza el mtodo setBakcground(), mientras que setForeGround() permite asignarle color al texto y a las lneas. La clase Color define las siguientes constantes para especificar colores: Color.black Color.blue Color.cyan Color.darkGray Color.gray Color.green Color.lightGray Color.magenta Color.orange Color.pink Color.red Color.white Color.yellow Las siguientes instrucciones asignan un fondo de color cyan y el texto de color azul. setBackGround(Color.cyan); setForeGround(Color.blue); Para obtener los colores actuales, se utilizan los mtodos getBackGround() y getForeGround(). Cuando un applet necesita actualizar la informacin mostrada en su ventana, se utiliza el mtodo repaint(). Cuando se necesita mostrar un mensaje, un applet puede utilizar la barra de estado del navegador mediante una llamada al mtodo showStatus Para el trazado de figuras geomtricas se tienen los siguientes mtodos: Mtodo Descripcin void drawLine(int x1, int y1, int x2, int y2) Dibuja una lnea desde las coordenadas x1,y1 hasta x2,y2 void drawRect(int x1, int y1, int ancho, int alto) Dibuja un rectngulo desde las coordenadas x1,y1 con un ancho y un alto especficos. void drawRoundRect(int x1, int y1, int ancho, int Dibuja un rectngulo redondeado desde las alto, int xDiametro, int yDiametro) coordenadas x1,y1 con un ancho y un alto especficos, y los dimetros de los arcos de las esquinas xDiametro y yDiametro. void fillRect(int x1, int y1, int ancho, int alto) Rellena un rectngulo desde las coordenadas x1,y1 con un ancho y un alto especficos. 8
Esta tabla permite definir una grfica en un plano cartesiano de dos ejes, uno para los valores de la variable x (horizontal) y otro para los valores de la funcin (vertical). La grfica se realiza trazando lneas entre dos puntos cada uno correspondiente a la pareja compuesta por un valor de la variable y el respectivo valor de la funcin (x, f(x)). Por ejemplo: Punto 1=(-10,-100) al Punto 2=(-9,-81) Punto 2=(-9,-81) al Punto 2=(-8,-64)
Estos clculos comprenden el manejo de las siguientes variables: xi: Valor inicial de x. Corresponde al pixel 0
xf: Valor final de x. Corresponde al pixel del tamao del applet dado por getWidth(). yi: Valor mximo de la funcin. Corresponde al pixel 0 yf: Valor mnimo de la funcin. Corresponde al pixel del tamao del applet dado por getHeight(). dx: Valor de incremento de x para un pixel. Equivalente a (xf xi)/getWidth(). dy: Valor de incremento de la funcin para un pixel. Equivalente a (yi yf)/getHeight()
Para un valor de x determinado, el pixel correspondiente sera: (x xi)/dx Para un valor de y determinado, el pixel correspondiente sera: (yi - y)/dx La grfica de la funcin se har trazando pequeas lneas con una distancia horizontal de slo 1 pixel lo cual dar el efecto de curva de la funcin. Para ello se calculan dos valores de la variable x contiguos (con una diferencia de dx) y sus respectivos valores f(x) y se traza una lnea. Seguido, se traza la lnea siguiente y as sucesivamente de izquierda a derecha hasta llegar al ltimo pxel que corresponde al valor xf. El siguiente cdigo resuelve el problema: import java.awt.*; import java.applet.*; public class Funcion extends Applet { float f(float x) { Float f=new Float(Math.pow(x,3)); return f.floatValue(); } public void paint(Graphics g) { g.setColor(Color.blue); //Lmites de X float xi=-10;float xf=10; //Incremento de X por pixel float dx=(xf-xi)/getSize().width; 10
11
Imgenes Una imagen es bsicamente un objeto grfico rectangular. Inicialmente las grficas aceptadas en el Web eran en formato GIF que fue creado por Compuserve en 1987 para hacer posible que las imgenes se viesen mientras cargaban pero slo podan tener hasta 256 colores. Luego apareci el formato JEPG el cual fue creado por un grupo experto en fotografas para almacenar imgenes en color real. El formato JEPG tiene un mayor grado de compresin pero no soporta transparencia ni animacin. Cuando se trabaja con imgenes, se pueden realizar las siguientes operaciones: Mtodo Descripcin Image getImage(URL url, String archivoImagen) Carga la imagen desde fuentes externas. boolean drawImage(Image objetoImagen, int x, int y, Muestra una imagen cargada. Es un mtodo de ImageObserver objetoImagen) la clase Graphics. El objeto de la clase ImafeObserver generalmente es null. Image createImage(ImageProducer generadorImagen) Crea una imagen a partir de un generador de imgenes, como por ejemplo FilteredImageSource, la cual es una clase que permite filtrar imgenes. El siguiente ejemplo permite mostrar la imagen de un dibujo tridimensional del relieve de la ciudad de Medlln almacenado en el archivo Medelln.jpg: import java.applet.*; import java.awt.*; public class ImagenMedellin extends Applet{ Image imagen; public void init() { imagen=getImage(getDocumentBase(),"Medellin.jpg"); } public void paint(Graphics g) { 12
Recorte de imgenes Basado en el trabajo con imgenes, es posible realizar applets que muestren una secuencia de imgenes para generar una animacin. Las tramas de la animacin se obtienen de una nica imagen que se puede dividir en una especie de rejilla utilizando coordenadas.
La clase CropImageFilter filter filtra una imagen origen para extraer una regin rectangular, lo cual es til cuando se desean utilizar varias imgenes pequeas obtenidas a partir de una imagen origen ms grande. Cargar 20 imgenes de 2K es mucho ms lento que cargar un nico archivo de 40K. Para que se efecte el filtrado de la imagen se requiere un objeto de la clase FilteredImageSource la cual es una subclase de ImageProducer que es una interfaz que genera datos de imagen. 13
El cdigo en Java es el siguiente: import java.applet.*; import java.awt.*; import java.awt.image.*; public class RecorteImagen extends Applet { Image imagen, imagenFiltrada; public void init() { imagen=getImage(getDocumentBase(),"Monalisa.jpg"); CropImageFilter cif=new CropImageFilter(0,0,50,50); FilteredImageSource fis=new FilteredImageSource(imagen.getSource(),cif); imagenFiltrada=createImage(fis); } public void paint(Graphics g) { g.drawImage(imagenFiltrada,0,0,null); } public void update(Graphics g) { paint(g); } } Cuya ejecucin se vera as:
14
Hilos Un programa multihilo contiene dos o ms partes que pueden ejecutarse de forma concurrente. Cada parte de ese programa se llama hilo (Thread) y cada hilo establece un camino de ejecucin independiente. Es un tipo de multitarea distinta a la multitarea por procesos, la cual ejecuta varios programas a la vez. En Java, es un solo programa con varios hilos a la vez. La programacin multihilo permite escribir programas muy eficientes que utilizan al mximo la CPU, reduciendo al mnimo el tiempo que est libre. Esto es importante en los entornos interactivos y en red en los que se trabaja con Java. Los hilos en Java son algo comn. Dado que Java hace tan sencillo emplear los hilos, las bibliotecas de clase de Java requieren su uso en cierto nmero de casos. Por ejemplo, todo applet que ejecute animacin lo logra mediante un hilo. En un entorno de programacin de un hilo nico, cuando el hilo se bloquea, deteniendo la ejecucin porque est esperando algn recurso, detiene por completo el programa. En el entorno de programacin multihilo de Java, un hilo puede detenerse sin parar las otras partes del programa. Por ejemplo, el tiempo que queda libre cuando un hilo lee datos de una red o espera datos de entrada de un usuario, se puede utilizar en cualquier otra parte. Cuando un hilo se bloquea en un programa Java, slo ese hilo se detiene y todos los dems continan su ejecucin. Los hilos pueden estar en distintos estados. Un hilo puede estar ejecutndose. Tambin puede estar preparado para ejecutarse tan pronto como disponga de tiempo de CPU. Un hilo que est ejecutndose puede suspenderse, lo que equivale a detener temporalmente su actividad. El hilo suspendido puede reanudarse permitiendo que continue su tarea all donde la dej. Un hilo puede estar bloqueado cuando espera un recurso. En cualquier momento, un hilo puede detenerse, finalizando su ejecucin de manera inmediata. Una vez detenido, un hilo no puede reanudarse. El intrprete de Java utiliza prioridades para determinar como debe tratar cada hilo con respecto a los dems. Es un valor entero que se utiliza para decidir cundo se pasa a ejecutar otro hilo, lo cual se conoce como cambio de contexto. Un hilo puede ceder el control voluntariamente al bloquearse o en espera de una E/S pendiente. La CPU ejecuta a continuacin, el hilo que tenga mayor prioridad y est preparado para ejecucin. Un hilo tambin puede ser desalojado por otro de mayor prioridad.
15
Al comenzar la ejecucin de un programa en Java, ya hay un hilo ejecutndose. Es el llamado hilo principal del programa. Este es muy importante porque es el hilo a partir del cual se crean el resto de hilos y debe ser el ltimo que termine su ejecucin. Aunque el hilo principal se crea automticamente cuando comienza el programa, se puede controlar a travs de un objeto Thread. Para hacer esto, es necesario obtener una referencia a l, llamando al mtodo currentThread(). El cdigo que aparece a continuacin permite simular el funcionamiento de un reloj de manecillas. Para ello se realiza la grfica del reloj compuesta de: circunferencia, nmeros y manecillas. Esta grfica se debe estar actualizando constantemente para brindar el efecto del desplazamiento de las manecillas. Esto se logra redibujando el applet en instantes de tiempo cortos, para lo cual se utiliza un hilo que se encargar de hacer las pausas. Este hilo har referencia al hilo principal. import java.util.*; import java.awt.*; import java.applet.*; import java.text.*; public class Reloj extends Applet implements Runnable 16
Animaciones Ahora bien, para poder realizar una animacin, es imprescindible hacer una buena gestin de las imgenes cargadas simultneamente. Para ello se tiene la clase MediaTracker la cual define un objeto que comprueba el estado de un nmero arbitrario de imgenes en paralelo. Para utilizar MediaTracker hay que crear una nueva instancia y usar su mtodo addImage() para aadir una imagen al control del estado de la carga. Este mtodo tiene dos argumentos: el objeto Image y un nmero entero para identificar la imagen. Cuando se utiliza MediaTracker, una vez que se ha llamado al mtodo addImage() sobre una imagen, su referencia en MediaTracker evita que el sistema la elimine a travs del mecanismo de recogida de basura. Una vez que se ha cargado la imagen original, sta se corta en un nmero determinado de pequeas imgenes. Entonces se comienza la ejecucin de un hilo que va mostrando las imgenes en el orden que se considera conveniente. El hilo debe dormir un tiempo suficiente para mantener la velocidad en la que se muestran las tramas. import java.applet.*; import java.awt.*; import java.awt.image.*; public class Animacion extends Applet implements Runnable{ Image imagen,fondo; Image diapositiva[]=new Image[22]; public void init() { try { fondo=getImage(getDocumentBase(),"FondoCasa.jpg"); 19
Donde se puede observar una especie de desplazamiento de la figura. TEMA 3 Ejercicios de aplicacin
1. Elaborar una animacin en un applet que permita hacer una transicin de una imagen a otra en varios barridos. Cada barrido va mostrando ms de la figura siguiente y menos de la segunda, como se observa en la siguiente grfica:
21