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

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

Embed Size (px)

Citation preview

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