Programación avanzada en Java Miguel Ángel Corella 23 de Septiembre de 2005.

24
Programación avanzada en Java Miguel Ángel Corella 23 de Septiembre de 2005

Transcript of Programación avanzada en Java Miguel Ángel Corella 23 de Septiembre de 2005.

Page 1: Programación avanzada en Java Miguel Ángel Corella 23 de Septiembre de 2005.

Programación avanzadaen Java

Miguel Ángel Corella23 de Septiembre de 2005

Page 2: Programación avanzada en Java Miguel Ángel Corella 23 de Septiembre de 2005.

Funciones matemáticas

• Constantes: Math.PI, Math.E• Métodos (mirar los parámetros en la API):

sqrt pow random abs max round cos

sin tan acos exp log …

• Todos los métodos y constantes son estáticos (acceso Math.xxx).

Page 3: Programación avanzada en Java Miguel Ángel Corella 23 de Septiembre de 2005.

Escritura de ficheros de texto

• Clase java.io.PrintStream.

• Funciona igual que System.out, pero se imprime a un fichero.

PrintStream printer = new PrintStream (new FileOutputStream ("abc.txt"));

printer.print ("Dos + " + 2);printer.println (" = " + (2+2));...printer.close ();

• Emite la excepción: java.io.IOException

Page 4: Programación avanzada en Java Miguel Ángel Corella 23 de Septiembre de 2005.

Lectura de ficheros de texto

• Clase java.io.BufferedReader

• Funciona igual que System.in, pero se lee de un fichero.

• Emite la excepción: java.io.IOException

BufferedReader reader = new BufferedReader (new FileReader ("abc.txt"));

String str = reader.readLine ();...reader.close ();

Page 5: Programación avanzada en Java Miguel Ángel Corella 23 de Septiembre de 2005.

Jerarquías declases

Page 6: Programación avanzada en Java Miguel Ángel Corella 23 de Septiembre de 2005.

Definición de subclases

class Persona { String nombre; int edad; String descripcion () { return "Nombre: " + nombre + "\nEdad: " + edad; }}

class Empleado extends Persona { long sueldoBruto; Directivo jefe;}

class Directivo extends Empleado { int categoria; Vector subordinados = new Vector (); void promocionar () { categoria++; }}

Page 7: Programación avanzada en Java Miguel Ángel Corella 23 de Septiembre de 2005.

Jerarquía de tipos (I)

Persona x1, x2;

Empleado y, emp = new Empleado ();

Directivo z, dir = new Directivo ();

• Conversión automática implícita (generalización)

x1 = emp; // Empleado Persona

x2 = dir; // Directivo Persona

y = dir; // Directivo Empleado

• Conversión explícita (especialización), responsabilidad del programador

z = x2; // Error de compilación

z = (Directivo) x2; // Persona Directivo

z = (Directivo) x1; // Error de ejecución:

// x1 no es un Directivo

z = (Perro) x1; // Error de compilación (a menos que Perro

// fuese subclase o superclase de Persona)

Un Directivo puedehacer automáticamente

el papel de Empleadoy de Persona

Una Persona puedehacer el papel de

Directivo si realmentees un Directivo

Page 8: Programación avanzada en Java Miguel Ángel Corella 23 de Septiembre de 2005.

Jerarquía de tipos (y II)

class C { void f (Empleado p) { ... } void g (Directivo p) { ... }}

Directivo dir = new Directivo ();Empleado x, emp = new Empleado ();C c = new C ();

• Conversión implícitac.f (dir); // Directivo Empleado

• Conversión explícitac.g (x); // Error de compilaciónc.g ((Directivo) x); // Empleado Directivoc.g ((Directivo) emp); // Error de ejecución: emp no es // un Directivo

Page 9: Programación avanzada en Java Miguel Ángel Corella 23 de Septiembre de 2005.

Herencia de variables y métodos

Empleado emp = new Empleado ();Directivo dir = new Directivo ();

emp.nombre = "Pedro"; emp.edad = 28; emp.sueldoBase = 200;emp.jefe = dir;System.out.println (emp.descripcion ());

dir.nombre = "Maria"; dir.edad = 45; dir.sueldoBruto = 700;dir.jefe = null;dir.categoria = 3;System.out.println (dir.descripcion ());

Page 10: Programación avanzada en Java Miguel Ángel Corella 23 de Septiembre de 2005.

Herencia y jerarquía de tipos

nombreedad

sueldojefe

categoría

Pe

rson

a

Em

plea

do

Dire

ctivo

p

empdir

Page 11: Programación avanzada en Java Miguel Ángel Corella 23 de Septiembre de 2005.

Sobreescritura en herencia

• Redefinición de variables y métodos de una clase padre en una subclase

• La definición de la subclase oculta a la de la superclase

• La definición de la superclase accesible desde la subclase con super

• Sobreescritura de métodos (especialización)– El método se redefine con los mismos argumentos y tipo de retorno

– Si no coinciden los tipos de los argumentos, se trata de una sobrecarga

– No se puede aumentar la privacidad de los métodos sobreescritos

– Evita la proliferación de identificadores

– Permite la ligadura dinámica

• Sobreescritura de variables– Se reserva un espacio de memoria para cada definición

– El tipo no tiene por qué coincidir

– En general es preferible evitar la sobreescritura de variables

Page 12: Programación avanzada en Java Miguel Ángel Corella 23 de Septiembre de 2005.

Sobreescritura de métodos

class Empleado extends Persona { long sueldoBruto; Directivo jefe; String descripcion () { return "Nombre: " + nombre + "\nEdad: " + edad + "\nSueldo: " + sueldoBruto + "\nJefe: " + ((jefe == null)? nombre : jefe.nombre); }}

// Bloque mainEmpleado emp = new Empleado ();Persona p = emp;emp.descripcion (); // descripcion de Empleadop.descripcion (); // descripcion de Empleado

Page 13: Programación avanzada en Java Miguel Ángel Corella 23 de Septiembre de 2005.

Ligadura dinámica

• La sobreescritura de métodos se resuelve por ligadura dinámica en tiempo de ejecución

• Se ejecuta la definición del método de la clase más específica del objeto, independientemente de cómo se ha declarado la referencia al objeto

A

B

C

D

E

void f ()

void f ()

void f ()

E obj = new E();

A x = obj;

x.f();

obj pertenece a las clases A, B, C, D, E

x declarado como A,apunta a un E

se ejecuta la versiónde f definida en D

Page 14: Programación avanzada en Java Miguel Ángel Corella 23 de Septiembre de 2005.

Ejemplo de ligadura dinámica (I)

class Persona { String nombre; int edad; String descripcion () { return "Nombre: " + nombre + "\nEdad: " + edad; }}

class Empleado extends Persona { long sueldoBruto; Directivo jefe; String descripcion () { return "Nombre: " + nombre + "\nEdad: " + edad + "\nSueldo: " + sueldoBruto + "\nJefe: " + ((jefe == null)? nombre : jefe.nombre); }}

Page 15: Programación avanzada en Java Miguel Ángel Corella 23 de Septiembre de 2005.

Ejemplo de ligadura dinámica (II)

class Directivo extends Empleado { int categoria; Vector subordinados = new Vector (); String descripcion () { return "Nombre: " + nombre + "\nEdad: " + edad + "\nSueldo: " + sueldoBruto + "\nJefe: " + ((jefe == null)? nombre : jefe.nombre) + "\nCategoria: " + categoria; } void promocionar () { categoria++; }}

Page 16: Programación avanzada en Java Miguel Ángel Corella 23 de Septiembre de 2005.

Ejemplo de ligadura dinámica (y III)

// Bloque main

Directivo dir = new Directivo ();

Empleado emp = new Empleado ();

Empleado z = dir;

Persona p = new Persona ();

Persona x = emp;

Persona y = z;

p.descripcion (); // descripcion de Persona

emp.descripcion (); // descripcion de Empleado

dir.descripcion (); // descripcion de Directivo

x.descripcion (); // descripcion de Empleado

y.descripcion (); // descripcion de Directivo

z.descripcion (); // descripcion de Directivo

y.promocionar (); // ERROR

Page 17: Programación avanzada en Java Miguel Ángel Corella 23 de Septiembre de 2005.

Interfaces

Page 18: Programación avanzada en Java Miguel Ángel Corella 23 de Septiembre de 2005.

Motivación de interfaces (I)

// Algoritmo de ordenacion

public class Algoritmos {

public static void ordenar (double valores[]) {

int i, j;

for (i = 0; i < valores.length; i++)

for (j = valores.length; j > i; j--)

if (valores[j] < valores[j-1])

intercambiar (valores, j, j-1);

}

}

Page 19: Programación avanzada en Java Miguel Ángel Corella 23 de Septiembre de 2005.

Motivación de interfaces (y II)

• ¿Y si queremos ordenar valores int?• Las interfaces permiten generalizar

funcionalidad.

// Generalizacion

public class Algoritmos {

public static void ordenar (Ordenable valores[]) {

int i, j;

for (i = 0; i < valores.length; i++)

for (j = valores.length; j > i; j--)

if (valores[j].menor (valores[j-1]))

intercambiar (valores, j, j-1);

}

}

Interfaz (o capacidad) cumplida por los objetos que se pueden ordenar

Método que deben implementar todos los objetos que se pueden ordenar

Page 20: Programación avanzada en Java Miguel Ángel Corella 23 de Septiembre de 2005.

Solución al problema (I)

interface Ordenable { boolean menor (Ordenable valor);}

class Directivo extends Empleado implements Ordenable { ... public boolean menor (Ordenable dir) { return categoria < ((Directivo) dir).categoria; }}

class Figura implements Ordenable { ... public boolean menor (Ordenable fig) { return area () < ((Figura) fig).area (); } }

Page 21: Programación avanzada en Java Miguel Ángel Corella 23 de Septiembre de 2005.

Solución al problema (y II)

public static void main (String args[]) {

Directivo jefes[] = {

new Directivo (...),

new Directivo (...),

new Directivo (...)

};

Figura objcompuesto[] = {

new Triangulo (...),

new Circulo (...),

new Rectangulo (...)

};

Algoritmos.ordenar (jefes);

Algoritmos.ordenar (objcompuesto);

}

Page 22: Programación avanzada en Java Miguel Ángel Corella 23 de Septiembre de 2005.

¿Qué es una interfaz?

• Colección de métodos sin definir y valores constantes

• Extender de una clase implementar una interfaz

• Una clase puede implementar varias interfaces

Page 23: Programación avanzada en Java Miguel Ángel Corella 23 de Septiembre de 2005.

¿Para qué sirve una interfaz?

• Una interfaz impone un protocolo de métodos a implementar• Una interfaz introduce un nuevo tipo• Las clases que implementan la interfaz son compatibles con este

tipo• Las interfaces posibilitan la herencia múltiple en cuanto a jerarquía

de tipos:• Una interfaz define un tipo una clase puede tener múltiples

supertipos• Sin embargo una interfaz no tiene contenido que heredar:

– los métodos no tienen código

– las variables se heredan pero son inamovibles (son estáticas y constantes)

• Una interfaz no proporciona funcionalidad a un objeto, sino la posibilidad de ser objeto de la funcionalidad de otros objetos

Page 24: Programación avanzada en Java Miguel Ángel Corella 23 de Septiembre de 2005.

Programación avanzadaen Java

Miguel Ángel Corella23 de Septiembre de 2005