Download 1. Introducción al lenguaje Java.

Document related concepts
no text concepts found
Transcript
ÍNDICE:
!
Programación con Java:
1. Introducción al lenguaje Java:
! Fundamentos.
! Gestión de eventos.
2. Creación y uso de "threads".
3. Sincronización.
Referencias:
•
•
•
•
•
•
http://nuvol.uji.es/~vcholvi/teaching/dstr.html
http://Java.sun.com
http://www.fie.us.es/docencia/publi/JAVA/
http://usuarios.tripod.es/Ozito/index.html
http://www.lucas.simplenet.com/trabajos/java/java.html
http://www.ctv.es/USERS/pagullo/arti/javacpp.htm
1. Introducción al lenguaje Java.
Java: Es un cambio radical en el desarrollo de software pero
reimplementando las buenas soluciones:
!
Entornos de desarrollo visuales (Kawa, VisualAge, Forte,
J++,...).
!
Paradigma principal: orientado a objetos.
!
Abstracción para el acceso a base de datos JDBC.
Elementos que consiguen que le lenguaje Java sea una tecnología
diferente:
!
Applets: aplicaciones pequeñas, dinámicas, seguras,
multiplataforma, activas y en red.
!
Lenguaje de programación poderoso: orientado a objetos,
sintaxis simple y familiar, entorno robusto y agradable.
!
Clases de objeto: abstracciones para las funciones del
sistema habituales como gestión de ventanas, de red y de
entrada/salida.
Lenguaje de programación revolucionario:
!
Simple: Aprendizaje simple partiendo de conocimientos de
programación O. O.
o No muestra las interioridades del sistema.
!
Orientado a objetos: Modelo de objetos simple y fácil de ampliar
combinado con tipos simples que son “no objetos de alto
rendimiento”.
!
Robusto: Java evita muchas de loas principales causas de error
del programador:
o Gestión de memoria avanzada: recogida de basura.
o Orientado a objetos integrados.
o Se detectan los errores de tipos y de declaración en tiempo
de compilación.
!
Interactivo: Posibilita la construcción de sistemas interactivos que
se ejecutan sin problemas.
!
Arquitectura neutral: Se compila en una representación
intermedia llamada código byte de java que es interpretable en
cualquier sistema que tenga un interprete Java.
!
El problema de los lenguajes interpretados es que son poco
eficientes.
!
Sin embargo, el código byte de Java es sencillo de traducir a
código máquina nativo consiguiendo un rendimiento alto.
!
Se compila en código de byte de alto nivel independiente de la
máquina.
!
Seguro:
o No se puede llamar a funciones globales para ganar el
acceso a recursos del sistema.
o No se producen desbordamiento en la pila.
o No hay conversiones ilegales entre datos.
o El cargador de Clases puede verificar una firma digital
antes de realizar una instancia de un objeto (validar los
privilegios de acceso).
o Las operaciones con archivos se trabajan sobre el disco
duro de la máquina de donde partió el applet.
!
Puede ejecutarse desde una máquina hipotética que es
implementada por un sistema run-time, que si es dependiente de
la máquina.
!
Son dependientes del sistema la Máquina Virtual Java (JVM) y
las librerías fundamentales, que nos permiten acceder la
hardware.
!
También existen APIs de Java que entran en contacto con el
hardware:
o Java 2D: gráficos 2D y manipulación de imágenes.
o Java Media Framework: Elementos críticos en el tiempo:
audio, vídeo...
o Java Animation: Animación de objetos en 2D.
o Java Telephony: Integración con telefonía.
o Java Share: Interacción entre aplicaciones multiusuario.
o Java 3D: Gráficos 3D y su manipulación.
Clases de Internet:
!
Conjunto de clases comunes que pueden crecer y posibilitan que
muchos programadores creen objetos en Java que interactúan.
!
Clases de Internet: proporcionan un modelo unificador de
protocolos de internet para PC, Mac y estaciones de trabajo
Unix.
!
Trabajo en red con TCP/IP: Implementaciones de ftp, http,
sockets de red de bajo nivel, etc. Protocolos de Internet ->
objetos de Java simples.
!
WWW y HTML:
o Utilización de applets insertadas en páginas HTML.
o Clases de manipulación de cadenas adecuadas al tipo de
procesamiento de texto que forma parte de cualquier
programa basado en HTML.
!
Programas distribuidos:
o Invocación a objetos remotos.
o Código que se ejecuta de manera distribuida a través de la
red.
!
Acceso a Base de Datos (JDBC).
Clases requeridas por cualquier entorno JAVA:
!
Lenguaje:
o Clase String
o Clase Thread
o Clase Exception
o Clase Error
o Clase Math
!
Utilidades: conjunto completo de estructuras de datos complejas
y sus métodos asociados (pilas, matrices, tablas, etc...).
!
Entrada/Salida.
!
Trabajo en red a bajo nivel.
!
Clases de la interfaz de usuario abstracta AWT: abstracciones
para ventanas, botones, menús
Lenguaje JAVA
!
Facilidad para aplicaciones relacionadas con INTERNET
(applets), aunque también para tareas de propósito general.
!
¿Cuándo Java no es la mejor elección?
o Texto por Internet -> HTML (menor coste de transferencia y
de interpretación).
o Aplicaciones de propósito general rápidas. Ej: en funciones
del API de Windows.
Programar en JAVA
!
Compilación y ejecución del la aplicación típica “Holamundo”
// Aplicación HolaMundo de ejemplo
public class HolaMundo
{
public static void main( String args[] )
{
System.out.println( "Hola Mundo!" );
}
}
!
Se debe almacenar el texto en un archivo llamado
HolaMundo.java. El nombre del archivo debe coincidir con el
nombre de la clase.
!
El compilador javac crea un archivo HolaMundo.class que
contiene el código byte compilado de nuestro programa
(instrucciones del lenguaje máquina para el interprete de
maquina virtual Java).
javac HolaMundo.java
!
El compilador javac se encuentra en el directorio bin por
debajo de directorio Java donde se halla instalado el JDK.
Un Applet:
!
Compilación y ejecución del applet HolaMundo con el siguiente
código:
import java.applet.Applet;
import java.awt.Graphics;
public class HolaMundo extends java.applet.Applet{
public void paint(Graphics g){
g.drawString(“Hola Mundo”,5,50);
}
}
!
Se debe almacenar en un archivo llamado HolaMundo.java
!
El compilador crea un archivo llamado HolaMundo.class
!
Creación del fichero HTML que incluye el applet ubicado en el
mismo directorio que se encuentra la clase:
<HTML>
<HEAD>
<TITLE> Applet HolaMundo </TITLE>
</HEAD>
<BODY>
<P> Este es el applet HolaMundo:
<BR>
<APPLET CODE=”HolaMundo.class” WIDTH=100
HEIGHT=80>
</APPLET>
</BODY>
</HTML>
!
La ejecución del applet se realiza con appletviewer o con el
navegador.
!
Un applet es una mínima aplicación Java diseñada para
ejecutarse en un navegador Web. No necesita método main().
!
El appletviewer crea un espacio de navegación, incluyendo
un área gráfica, donde se ejecutara el applet.
Métodos de la clase Applet:
public void init (): Se activa cuando el applet es cargado.
public void init() {
if( width < 200 || height < 200 )
resize( 200,200 );
valor_global1 = 0;
valor_global2 = 100;
//
cargaremos
imágenes
en
memoria
sin
mostrarlas
// cargaremos música de fondo en memoria sin
reproducirla
}
public void start (): Llamada para activa el applet. Es llamada
cuando se visita el applet. Las clases derivadas deberían
sobrecargarlo para comenzar una animación, sonido, etc.
public void start()
{
estaDetenido = false;
// comenzar la reproducción de la música
musicClip.play();
}
public void paint (): Llamada cada vez que se refresca el área
de dibujo del applet.
void public paint( Graphics g ) {
g.drawString( "Hola Java!",25,25 );
// Dibujaremos la imágenes que necesitemos
}
public void stop (): Llamada para detener el applet.
public void stop()
{
estaDetenido = true;
if( /* ¿se está reproduciendo música? */ )
musicClip.stop();
}
public void destroy (): Es llamada cuando el applet no se va a
usar más. En applet multithread deberán usar destroy() para
“matar” cualquier thread del applet que quedase activo.
public void run (): Contiene el código que se ejecutará: bucle
del applet, nuevos métodos, etc. En gráficos suele llamar a
repaint() para refrescar el área de dibujo.
La marca applet de html:
Dado que los applets están mayormente destinados a
ejecutarse en navegadores Web, había que preparar el lenguaje
HTML para soportar Java, o mejor, los applets.
El esquema de marcas de HTML, y la evolución del estándar
marcado por Netscape hicieron fácil la adición de una nueva marca
que permitiera, una vez añadido el correspondiente código gestor
en los navegadores, la ejecución de programas Java en ellos.
La sintaxis de las etiquetas <APPLET> y <PARAM> es la que
se muestra a continuación y que se irá explicando en párrafos
posteriores:
<APPLET CODE= WIDTH= HEIGTH= [CODEBASE=] [ALT=]
[NAME=] [ALIGN=] [VSPACE=] [HSPACE=]>
<PARAM NAME= VALUE= >
</APPLET>
Los atributos que acompañan a la etiqueta <APPLET>, algunos son
obligatorios y otros son opcionales. Todos los atributos, siguiendo la
sintaxis de html, se especifican de la forma: atributo = valor. Los
atributos obligatorios son:
CODE
Indica el fichero de clase ejecutable, que tiene la extensión .class.
No se permite un URL absoluto, como ya se ha dicho, aunque sí
puede ser relativo al atributo opcional CODEBASE.
WIDTH
Indica la anchura inicial que el navegador debe reservar para el
applet en pixels.
HEIGHT
Indica la altura inicial en pixels. Un applet que disponga de una
geometría fija no se verá redimensionado por estos atributos. Por
ello, si los atributos definen una zona menor que la que el applet
utiliza, únicamente se verá parte del mismo, como si se visualiza a
través de una ventana, eso sí, sin ningún tipo de desplazamiento.
Los atributos opcionales que pueden acompañar a la marca
APPLET comprenden los que se indican a continuación:
CODEBASE
Se emplea para utilizar el URL base del applet. En caso de no
especificarse, se utilizará el mismo que tiene el documento.
ALT
Funciona exactamente igual que el ALT de la marca <IMG>, es
decir, muestra un texto alternativo, en este caso al applet, en
navegadores en modo texto o que entiendan la etiqueta APPLET
pero no implementen una máquina virtual Java.
NAME
Otorga un nombre simbólico a esta instancia del applet en la página
que puede ser empleado por otros applets de la misma página para
localizarlo. Así, un applet puede ser cargado varias veces en la
misma página tomando un nombre simbólico distinto en cada
momento.
ALIGN
Se emplea para alinear el applet permitiendo al texto fluir a su
alrededor. Toma los siguientes valores: LEFT, RIGHT, TOP,
TEXTTOP, MIDDLE, ABSMIDDLE, BASELINE, BOTTOM y
ABSBOTTOM.
VSPACE
Indica el espaciado vertical entre el applet y el texto, en pixels.
HSPACE
Funciona igual que el anterior pero indicando espaciamiento
horizontal, en pixels.
El Lenguaje
Comentarios
En Java hay tres tipos de comentarios:
// comentarios para una sola línea
/* comentarios de una o
más líneas
*/
/** comentario
líneas
*/
de
documentación,
de
una
o
más
Los comentarios de documentación, son colocados antes de una
declaración (de variable o función), indican que ese comentario ha
de ser colocado en la documentación que se genera
automáticamente cuando se utiliza la herramienta de Java, javadoc.
En este tipo de comentario para documentación, se permite la
introducción de algunos tokens o palabras clave, que harán que la
información que les sigue aparezca de forma diferente al resto en la
documentación.
Palabras clave
Las siguientes son las palabras clave que están definidas en Java y
que no se pueden utilizar como identificadores:
abstract
boolean
break
byte
byvalue
case
catch
char
class
const
continue
default
do
double
else
extends
false
final
finally
float
for
goto
if
implements
import
instanceof
int
interface
long
native
new
null
package
private
protected
public
return
short
static
super
switch
synchronized
this
threadsafe
throw
transient
true
try
void
while
Palabras Reservadas
cast future generic inner operator outer rest var
Operadores Aritméticos:
Para los tipos numéricos y char
+ suma
- resta
* multiplicación
/ división
% modulo
++ incremento
+= suma y asignación
-= resta y asignación
*= multiplicación y asignación
/= división y asignación
%= modulo y asignación
- - decremento
Ejemplo:
Class Incdec{
Public static void main(String args[]){
int a=1;
int b=2;
int c=++b;
int d=a++;
c++;
System.out.println(“a=” +a);
System.out.println(“b=” +b);
System.out.println(“c=” +c);
System.out.println(“d=” +d);
}
}
Operadores
==
!=
>
<
>=
<=
&
|
^
igual
distinto de
mayor que
menor que
mayor o igual que
menor o igual que
AND
OR
XOR
&& Condicional AND
|| Condicional OR
Arrays
Se pueden declarar en Java arrays de cualquier tipo:
char s[];
int iArray[];
Incluso se pueden construir arrays de arrays:
int tabla[][] = new int[4][5];
!
Los límites de los arrays se comprueban en tiempo de ejecución
para evitar desbordamientos y la corrupción de memoria.
!
En Java un array es realmente un objeto, porque tiene redefinido
el operador []. Tiene una función miembro: length. Se puede
utilizar este método para conocer la longitud de cualquier array.
int a[][] = new int[10][3];
a.length; /* 10 */
a[0].length; /* 3 */
!
Para crear un array en Java hay dos métodos básicos.
o Crear un array vacío:
int lista[] = new int[50];
o Crear ya el array con sus valores iniciales:
String nombres[] =
{"Juan","Pepe","Pedro","Maria"};
Esto que es equivalente a:
String nombres[];
nombres = new String[4];
nombres[0] = new String(
nombres[1] = new String(
nombres[2] = new String(
nombres[3] = new String(
"Juan" );
"Pepe" );
"Pedro" );
"Maria" );
Errores:
!
No se pueden crear arrays estáticos en tiempo de compilación:
int lista[50]; // generará un error en tiempo de
compilación
!
Tampoco se puede rellenar un array sin declarar el tamaño con
el operador new:
int lista[];
for( int i=0; i < 9; i++ )
lista[i] = i;
Accediendo a los elementos de un array:
int a[]=new int[100];
a[0]=0;
for(int i=1;i<a.length;i++) a[i]=i + a[i-1];
Operadores
Los operadores de Java son muy parecidos en estilo y
funcionamiento a los de C. En la siguiente tabla aparecen los
operadores que se utilizan en Java, por orden de precedencia:
. [] ()
++ -- ! ~ instanceof
* / %
+ << >> >>>
< > <= >=
== !=
&
^
|
&&
||
? :
=
Control de Flujo
Muchas de las sentencias de control del flujo del programa se han
tomado del C:
Sentencias de Salto:
if/else
if( Boolean ) {
sentencias;
}
else{
sentencias;
}
switch
switch( expr1 ) {
case expr2:
sentencias;
break;
case expr3:
sentencias;
break;
default:
sentencias;
break;
}
Sentencias de Bucle:
Bucles for
for( expr1 inicio; expr2 test; expr3 incremento )
{
sentencias;
}
El siguiente trocito de código Java que dibuja varias líneas en
pantalla alternando sus colores entre rojo, azul y verde. Este
fragmento sería parte de una función Java (método):
//int contador;
for(
int
contador=1;
contador
<=
12;
contador++ ){
switch( contador % 3 ) {
case 0:
setColor( Color.red );
break;
case 1:
setColor( Color.blue );
break;
case 2:
setColor( Color.green );
break;
}
g.drawLine( 10,contador*10,80,contador*10);
}
Java permite introducir cadenas en el bucle y soporta el operador
coma (,).
int i;
String s;
for (i=0, s=”testing”;(i<10)&&(s.length()>=1);
i++,s=s.substring(1)){
System.out.println(s);
}
Los bucles do_while y while son igual que en C.
Excepciones
!
Una excepción en Java es un objeto que describe una condición
anormal que se ha producido en un fragmento de código.
!
Cuando surge una excepción se crea el objeto Exception que
se envía al método que ha provocado la excepción.
!
Formas de aparecer una excepción:
o Asincronamente.
o Creadas manualmente
try-catch-throw
try{
sentencias;
}
catch( Exception ) {
sentencias;
}
Excepciones asíncronas
!
Los objetos de excepción los crea automáticamente el intérprete
de Java como respuesta a alguna condición excepcional.
!
El flujo de código se interrumpe en la sentencia que provocó la
excepción y se busca en la pila de llamadas actual cualquier
gestor de excepciones.
!
Cuando no se ha establecido ningún gestor de excepciones, se
ejecuta el gestor por defecto en tiempo de ejecución.
try-catch
!
La instrucción try permite especificar el bloque de código que
se debería proteger frente a excepciones.
!
La cláusula catch permite resolver la condición excepcional
poniendo las variables
en un estado razonable y luego
continuar. Pueden tenerse varias clausulas catch.
!
El bloque de código finally se ejecuta siempre que se
produce una excepción y además cuando hay una sentencia
return.
Ejemplo:
class multiCatch{
public static void main(String args[]){
try{
int a=args.length;
System.out.println(“a= “+a);
int b=42/a;
int c[42]=99;
}
catch (AritmeticException e){
System.out.println(“div por 0: “+e);
}
catch (ArrayIndexOutBoundsException e){
System.out.println(“fuera de limites:
“ + e);
}
finally{
// Terminate the output with a
newline
System.out.println(“\n“);
}
}
}
Averiguar la excepción que se esta produciendo:
public class Prueba4{
public static void main(String [] args){
try{
int i = 4 /0;
}
catch(Exception e){
System.out.println(“Mensaje
capturado:”);
e.getMessage();e.printStackTrace();
}
}
}
!
Excepciones creadas por el usuario
throw
!
Permite lanzar explícitamente una excepción.
!
La forma general de una sentencia throw es:
Throw InstanciaThrowable;
!
La instancia Throwable debe ser
posteriormente capturada con catch.
creada
por
new
y
Ejemplo:
Class ThrowDemo{
static void demoproc(){
try{
throw new NullPointerException(“demo”);
}
catch(NullPointerException e){
System.out.println(“capturada
dentro
de
demoproc”);
throw e;
}
}
public static void main (String args[]){
try{
demoproc();
}
catch(NullPointerException e){
System.out.println(“capturada de nuevo “ +
e);
}
}
Programación orientada a objetos.
Clase
!
Los programas en Java sólo se pueden expresar como clases.
!
Un programa completo consta de varias clases almacenadas en
distintos archivos fuente.
!
ATENCIÓN: Java no soporta variables globales ni punteros.
!
Variables de instancia: Son las variables que se declaran dentro
de una clase y fuera del ámbito de un método concreto.
!
Métodos: Son subrutinas unidas a una definición de clase, se
declaran al mismo nivel que las variables de instancia.
public class Circle{
public double x,y;
public double r;
// Métodos
public double circunference(){
return 2*3.14159*r;
}
public double area(){
return 3.14159*r*r;
}
}
!
Cada clase que se crea añade un tipo que se puede utilizar igual
que los tipos simples.
!
Referencia a objeto: se utiliza el nombre de la clase como tipo en
la declaración de variables.
Circle c;
!
El objeto tiene un valor null hasta que se crea el objeto real y
esta variable lo apunta.
!
Operador new: Crea una única instancia de clase y devuelve una
referencia a ese objeto.
Circle c;
c = new Circle();
!
Acceso a los datos del objeto.
Circle c = new Circle();
c.x=2.0;
c.y=2.0;
c.r=1.0;
!
El acceso a los métodos del objeto es igual al acceso de los
datos.
Circle c = new Circle();
double a;
c.r=2.5;
a=c.area(); // igual que un tipo estructurado
!
Operador this: Se utiliza dentro de los métodos para referirse al
objeto actual.
!
También sirve para ocultar variables de instancia.
!
Puede ocurrir que los nombres de las variables locales o
parámetros formales se solapen con las variables de instancia.
!
Para referirnos a las variables de instancia utilizaremos this.
!
Los constructores inicializan un objeto inmediatamente después
de su creación.
!
No devuelven ningún valor (ni siquiera void) y tienen el mismo
nombre que la clase.
public class Circle{
public double x,y,r;
// constructor de nuestro método
public Circle(double x,double y, double r){
this.x=x;this.y=y;this.r=r;
}
public double circunference(){
return 2*3.14159*r;
}
public double area(){
return 3.14159*r*r;
}
}
!
Encapsulado: Clase = abstracción para un conjunto de objetos
que comparten la misma estructura y comportamiento.
!
Mecanismos para encapsular la complejidad: marcar cada
método o variable de una clase como público o privado.
!
PRIVADOS: no pueden se accedidos por otro código que esté
fuera de la implementación de la clase.
!
PÚBLICOS: accesibles por usuarios externos a la clase.
!
PROTEGIDOS: pueden se accedidos únicamente por métodos
de su clase y de clases derivadas de él.
Herencia
!
Subclase: es una clase que hereda todos los atributos y métodos
de sus antecesores en la jerarquía de clases. Es, por lo tanto,
una clase más específica.
!
Superclase: antecesor inmediato de una clase.
!
super: se refiere a los constructores de unas superclase.
También se puede utilizar para seleccionar directamente
métodos con nombre además de constructores.
!
ATENCIÓN: En Java no se puede hacer herencia múltiple,
simplemente se traspasa la funcionalidad de los métodos
asociados a la superclase.
Object------Circle------GraphicCircle
Math
System
Component---Container---Panel---Applet
Button
List
!
La superclase de una clase es especificado por la clausula
extends:
public class GraphicCircle extends Circle{
// automaticamente heredamos las variables y
//métodos de Circle.
Color outline,fill;
public void draw(DrawWindow dw){
dw.drawCircle(x,y,r,outline,fill);
}
}
Asignaciones:
GraphicCicle gc = new GraphicCircle();
// hereda el método area de la clase Circle
double area=gc.area();
!
Operador super: Para llamar al método padre dentro de una
clase que ha reemplazado ese método, se puede hacer
referencia al método padre con la palabra clave super:
import MiClase;
public class MiNuevaClase extends MiClase {
public void Suma_a_i( int j ) {
i = i + ( j/2 );
super.Suma_a_i( j );
}
}
Sobreescritura: Una subclase puede definir de manera diferente un
método de su superclase.
// superclase
class Point{
int x,y;
Point(int a, int b){ // constructor
x=a;y=b; }
double distancia(int a,int b){
int dx=x-a;
int dy=y-b;
return Math.sqrt(dx*dx+dy*dy);
}
}
class Point3D extends Point{
int z;
Point3D(int a, int b,int c){ // constructor
x=a;y=b;z=c }
double distancia(int a,int b){
double dx=(x/z) - a;
double dy=(y/z) - b;
return Math.sqrt(dx*dx+dy*dy);
}
}
Polimorfismo
!
Una clase tiene varios métodos con el mismo nombre.
!
A estos métodos se les pasa información en forma de
parámetros en la llamada al método.
!
Los parámetros determinan el método al que se tiene que llamar.
!
El método de la subclase oculta o anula el método de la clase
paterna.
!
La búsqueda del método asociado siempre empieza examinando
los métodos asociados con el objeto. Si no se encuentra ningún
método se busca entre los métodos asociados a la superclase.
// superclase
class Point{
int x,y;
Point(int a, int b){ // constructor
x=a;y=b; }
double distancia(int a,int b){
int dx=x-a;
int dy=y-b;
return Math.sqrt(dx*dx+dy*dy);
}
double distancia (Point p){
return distancia(int p.x,int p.y);
}
}
class Point3D extends Point{
int z;
Point3D(int a, int b,int c){ // constructor
x=a;y=b;z=c }
double distancia(int a,int b){
double dx=(x/z) - a;
double dy=(y/z) - b;
return Math.sqrt(dx*dx+dy*dy);
}
}
Ejemplos:
Point3D p1 = new Point3D(30,40,50);
Point3D p2 = new Point3D(0,0,0);
Point p = new Point(4,6);
System.out.println(p1.distancia(p));
System.out.println(p2.distancia(4,6);
Otras características.
!
Método finalizer(): Java no utiliza destructores ya que
recoge de forma automática los objetos que se salen de su
alcance
!
No obstante proporciona un método para cerrar ficheros, finalizar
conexiones de red, etc..
protected void finalized() throws IOException{
if (fd != null) close();
}
!
Clases Abstract:
declaran la estructura de la clase sin
proporcionar una implementación completa de cada método.
!
Una clase que contiene un método abstract también tiene que
ser declarada como abstract.
public abstract class Shape{
public abstract double area();
public abstract double circumference();
}
public class Circle extends Shape{
protected double r;
protected static final double PI= 3.14159;
public Circle(){r=1.0}
public Circle(double r){ return PI*r*r;}
public double area(){return 2*PI*r;}
}
!
Interfaces: proporcionan un mecanismo para abstraer los
métodos si forzar al usuario a utilizar la herencia.
!
Clases sin variables de instancia y con métodos declarados pero
sin cuerpo.
!
Se diferencian de las clases abstractas en que una clase puede
implementar un número ilimitado de interfaces, pero solo puede
heredarlos de una superclase.
public interface Drawable{
public void setColor(Color c);
public void setPosition(double x,double y);
public void draw(DrawWindow dw);
}
!
Las clases que quieran utilizar el interface Drawable utilizarán la
palabra implements y proporcionarán el código necesario para
implementar los métodos que se han definido en el interface:
public class DrawableRectangle extends Rectangle
inplements Drawable{
// new instance variables
private Color c;
private double x,y;
// constructor
public DrawableRectangle(double w,double h){
super(w,h);}
// implementations of the Drawable methods
public void setColor(Color c){this.c=c;}
public void setPosition(double x,double y){
this.x=x;this.y=y; }
public void draw(DrawWindow dw){
dw.drawRect(x,y,w,h,c);
}
}
Utilización
Shape[] shapes= new Shape[3];
Drawable[] drawables = new Drawable[3];
// create some drawable
DrawableCircle dc = new
DrawableSquare ds = new
DrawableRectangle
dr
(2.3,4.5);
shapes
DrawableCircle(1,1);
DrawableSquare(2,5);
=
new
DrawableRectangle
// Las formas pueden ser asignadas a ambos arrays
shapes[0]= dc;
shapes[1]=ds;
shapes[2]= dr;
drawables[0]= dc;
drawables[1]=ds;
drawables[2]= dr;
double total_area=0.0;
for (int i=0;i<shapes.length;i++)
total_area+= shapes[i].area();
Gestión de eventos
!
Los eventos sólo recibe aquellas componentes que las llaman
mediante un sistema de "clases de escucha".
!
Estas implementa un interface genérico con eventos y se registra
con un objeto productor de eventos.
!
Es necesario importar las clases java.awt.event.*
!
Ejemplo: Applet que dibuja un punto azul cuando se pulsa un
boton del ratón.
import java.awt.Graphics;
import java.awt.Color;
import java.awt.event.*;
public class Puntos extends java.applet.Applet{
final int MAXPUNTOS = 10;
int xpuntos[] = new int[MAXPUNTOS];
int ypuntos[] = new int[MAXPUNTOS];
int puntoact =0;
public void init(){
setBackground(Color.white);
addMouseListener(new M);
}
class M implements MouseListener{
//Se ha presionado un boton del ratón
public void mousePressed(MouseEvent e){
if(puntoact<MAXPUNTOS)
ponpunto(e.getX(),e.getY());
}
// soltar el botón del ratón
public void mouseReleased(MouseEvent e){};
// se ha pulsado el botón del ratón
public void mouseClicket(MouseEvent e){};
// el puntero del ratón sobre componente
public void mouseEntered(MouseEvent e){};
// salir ratón de la componente
public void mouseExited(MouseEvent e){};
}
void ponpunto(int x,int y){
xpuntos[puntoact]=x;
ypuntos[puntoact]=y;
puntoact++;
repaint();
}
public void paint(Graphics g){
g.setColor(Color.blue);
for(int i=0;i<puntoact;i++){
g.fillOval(xpuntos[i]-10,ypuntos[i]10,20,20); }
}
}
Movimientos del ratón.
!
Añadir en init un nuevo evento:
addMouseMotionListener (new M2();
!
Movimiento de ratón pulsado:
public void mouseDragged(MouseEvent e){};
!
Movimiento del ratón no pulsado:
public void mouseMoved(MouseEvent e){};
Dibujar mientras el ratón esta pulsado.
!
Sustituir MouseListener y MouseMotionListener.
class M1 extends MouseAdapter{}
class M2 extends MouseMotionAdapter{}
Eventos de Teclado
!
El método keyPressed() captura los eventos de teclado.
!
La clase KeyEvent tiene el método getKeyChar() que
devuelve el carácter correspondiente a la tecla que ha producido
el evento.
!
El método getKeyCode() devuelve un entero con el código de
la tecla.
!
Ejemplo: pintar el carácter tecleado en pantalla. Además,
podemos moverlo por la pantalla.
import
import
import
import
java.awt.Graphics;
java.awt.Color;
java.awt.event.*;
java.awt.Font;
public class Teclas extends java.applet.Applet{
char currkey;
int currx;
int curry;
public void init(){
currx=(this.getSize().width/2)-8;
curry=(this.getSize().height/2)-16;
setBackground(Color.white);
setFont(new
Font("Helvetica",Font.BOLD,36);
addKeyListener(new M());
}
class M extends KeyAdapter{
public void keypressed(Keyevent e){
switch(e.getKeyCode(){
case KeyEvent.VK_DOWN:
curry+=5;
break;
case KeyEvent.VK_UP:
curry-=5;
break;
case KeyEvent.VK_LEFT:
curry-=5;
break;
case KeyEvent.VK_RIGHT:
curry+=5;
break;
default:
currkey = e.getKeyChar();
}
repaint();
}
}
public void paint(Graphics g){
if(currkey !=0){
g.drawString(String.valueOf(currkey),currx
,curry); }
}
}