Скачать презентацию Programación avanzada en Java Miguel Ángel Corella 23 Скачать презентацию Programación avanzada en Java Miguel Ángel Corella 23

36ebdd3a03a5a08c6909d7f15ab56cda.ppt

  • Количество слайдов: 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

Funciones matemáticas • Constantes: Math. PI, Math. E • Métodos (mirar los parámetros en 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).

Escritura de ficheros de texto • Clase java. io. Print. Stream. • Funciona igual Escritura de ficheros de texto • Clase java. io. Print. Stream. • Funciona igual que System. out, pero se imprime a un fichero. Print. Stream printer = new Print. Stream (new File. Output. Stream ("abc. txt")); printer. print ("Dos + " + 2); printer. println (" = " + (2+2)); . . . printer. close (); • Emite la excepción: java. io. IOException

Lectura de ficheros de texto • Clase java. io. Buffered. Reader • Funciona igual Lectura de ficheros de texto • Clase java. io. Buffered. Reader • Funciona igual que System. in, pero se lee de un fichero. Buffered. Reader reader = new Buffered. Reader (new File. Reader ("abc. txt")); String str = reader. read. Line (); . . . reader. close (); • Emite la excepción: java. io. IOException

Jerarquías de clases Jerarquías de clases

Definición de subclases class Persona { String nombre; int edad; String descripcion () { Definición de subclases class Persona { String nombre; int edad; String descripcion () { return "Nombre: " + nombre + "n. Edad: " + edad; } } class Empleado extends Persona { long sueldo. Bruto; Directivo jefe; } class Directivo extends Empleado { int categoria; Vector subordinados = new Vector (); void promocionar () { categoria++; } }

Jerarquía de tipos (I) Persona x 1, x 2; Empleado y, emp = new Jerarquía de tipos (I) Persona x 1, x 2; Empleado y, emp = new Empleado (); Directivo z, dir = new Directivo (); • Conversión automática implícita (generalización) x 1 = emp; // Empleado Persona x 2 = dir; // Directivo Persona y • = dir; // Directivo Empleado Un Directivo puede hacer automáticamente el papel de Empleado y de Persona Conversión explícita (especialización), responsabilidad del programador z = x 2; // Error de compilación z = (Directivo) x 2; // Persona Directivo z = (Directivo) x 1; // Error de ejecución: // x 1 no es un Directivo Una Persona puede hacer el papel de Directivo si realmente es un Directivo z = (Perro) x 1; // Error de compilación (a menos que Perro // fuese subclase o superclase de Persona)

Jerarquía de tipos (y II) class C { void f (Empleado p) {. . 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ícita c. f (dir); // Directivo Empleado • Conversión explícita c. g (x); // Error de compilación c. g ((Directivo) x); // Empleado Directivo c. g ((Directivo) emp); // Error de ejecución: emp no es // un Directivo

Herencia de variables y métodos Empleado emp = new Empleado (); Directivo dir = Herencia de variables y métodos Empleado emp = new Empleado (); Directivo dir = new Directivo (); emp. nombre = "Pedro"; emp. edad = 28; emp. sueldo. Base = 200; emp. jefe = dir; System. out. println (emp. descripcion ()); dir. nombre = "Maria"; dir. edad = 45; dir. sueldo. Bruto = 700; dir. jefe = null; dir. categoria = 3; System. out. println (dir. descripcion ());

Herencia y jerarquía de tipos categoría Directivo sueldo jefe Empleado dir emp nombre edad Herencia y jerarquía de tipos categoría Directivo sueldo jefe Empleado dir emp nombre edad Persona p

Sobreescritura en herencia • Redefinición de variables y métodos de una clase padre en 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

Sobreescritura de métodos class Empleado extends Persona { long sueldo. Bruto; Directivo jefe; String Sobreescritura de métodos class Empleado extends Persona { long sueldo. Bruto; Directivo jefe; String descripcion () { return "Nombre: " + nombre + "n. Edad: " + edad + "n. Sueldo: " + sueldo. Bruto + "n. Jefe: " + ((jefe == null)? nombre : jefe. nombre); } } // Bloque main Empleado emp = new Empleado (); Persona p = emp; emp. descripcion (); // descripcion de Empleado

Ligadura dinámica • La sobreescritura de métodos se resuelve por ligadura dinámica en tiempo 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 void f () B void f () E obj = new E(); A x = obj; C x. f(); D E void f () obj pertenece a las clases A, B, C, D, E x declarado como A, apunta a un E se ejecuta la versión de f definida en D

Ejemplo de ligadura dinámica (I) class Persona { String nombre; int edad; String descripcion Ejemplo de ligadura dinámica (I) class Persona { String nombre; int edad; String descripcion () { return "Nombre: " + nombre + "n. Edad: " + edad; } } class Empleado extends Persona { long sueldo. Bruto; Directivo jefe; String descripcion () { return "Nombre: " + nombre + "n. Edad: " + edad + "n. Sueldo: " + sueldo. Bruto + "n. Jefe: " + ((jefe == null)? nombre : jefe. nombre); } }

Ejemplo de ligadura dinámica (II) class Directivo extends Empleado { int categoria; Vector subordinados Ejemplo de ligadura dinámica (II) class Directivo extends Empleado { int categoria; Vector subordinados = new Vector (); String descripcion () { return "Nombre: " + nombre + "n. Edad: " + edad + "n. Sueldo: " + sueldo. Bruto + "n. Jefe: " + ((jefe == null)? nombre : jefe. nombre) + "n. Categoria: " + categoria; } void promocionar () { categoria++; } }

Ejemplo de ligadura dinámica (y III) // Bloque main Directivo dir = new Directivo 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 (); emp. descripcion (); dir. descripcion (); x. descripcion (); y. descripcion (); z. descripcion (); y. promocionar (); // // descripcion descripcion ERROR de de de Persona Empleado Directivo

Interfaces Interfaces

Motivación de interfaces (I) // Algoritmo de ordenacion public class Algoritmos { public static 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); } }

Motivación de interfaces (y II) • ¿Y si queremos ordenar valores int? • Las Motivación de interfaces (y II) • ¿Y si queremos ordenar valores int? • Las interfaces permiten generalizar funcionalidad. // Generalizacion Interfaz (o capacidad) cumplida por los objetos que se pueden ordenar 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); } Método que deben } implementar todos los objetos que se pueden ordenar

Solución al problema (I) interface Ordenable { boolean menor (Ordenable valor); } class Directivo 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 (); } }

Solución al problema (y II) public static void main (String args[]) { Directivo jefes[] Solución al problema (y II) public static void main (String args[]) { Directivo jefes[] = { new Directivo (. . . ), new Directivo (. . . ) }; Figura objcompuesto[] = { new Triangulo (. . . ), new Circulo (. . . ), new Rectangulo (. . . ) }; Algoritmos. ordenar (jefes); Algoritmos. ordenar (objcompuesto); }

¿Qué es una interfaz? • Colección de métodos sin definir y valores constantes • ¿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

¿Para qué sirve una interfaz? • Una interfaz impone un protocolo de métodos a ¿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

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