1 Introducción a
Capítulo III TDA y OO
Tipos de Datos Abstractos,
Orientación a Objetos y
Lenguaje Java
1
Ventajas de la Encapsulación Tipos de Datos Abstractos (TDAs)
l Mayor modularidad l Un TDA, corresponde a una encapsulación
l Mejor mantención que incluye:
l Permite ser movido l La representación de un tipo de dato específico
l Ocultamiento de la información l Las operaciones asociadas a ese tipo
l Un objeto provee una interfaz para comunicarse l Una instancia de un TDA se denomina objeto
con él y abstrae de los detalles de
implementación
l Cambios en la información y métodos internos no
afectan a otros objetos
Ejemplo: Ocultamiento de la
Ocultamiento de Información Información
2
Soporte para Programación
Visión Computacional OO (PURA) Orientada a Objetos
l Un programa es un conjunto de objetos (instancias l Tipos de Datos Abstractos
de alguna clase), que corresponden a una l Clases y Objetos
abstracción del mundo real (problema) l Concepto de encapsulación
l Un objeto se comunica con otro objeto enviando un l Herencia
mensaje a algún método de este último, el cual le l Simple y múltiple
puede retornar otro objeto como resultado
l Polimorfismo, con especie particular de
l Procesamiento del mensaje puede alterar el estado
ligado dinámico de métodos a mensajes
del objeto (sus variables internas).
l Clases y métodos virtuales en C++
l Uso de interfaces en Java
Metodo A()
Metodo B()
Metodo C()
3
Mensajes Ejemplo de Mensaje
Cliente
Stack S
push(“Hola”)
push()
pop()
size()
int main(void ) {
complex cpl; // Crea una instancia de la clase (objeto)
cout << cpl.getRealPart();
...
}
4
Ejemplo: Ejemplo:
Implementación de un Stack en Java Creación de un objeto de clase Stack
Alumno getNombre()
Empleado public StackPrint(int i) { public staticvoid main(String[] args) {
curso : Integer login()
sueldo : Integer super(i);
titulo : String
promedio : Single load() } StackPrint stp = new StackPrint (5);
pagarSueldo()
nuevaAnotacion() stp.push("Hola-print ");
nuevaNota() public void print () { stp.push(args[0]);
registrarAsistencia()
rendirPrueba() Profesor System.out.println("tamaño: " + (top+1)); stp.print ();
horas_de_trabajo : Integer Administrativo for (int i=0; i<top+1; i++) {
jefeCurso : String cargo : String
System.out.println(i + ": " + buffer[i]); }
fijarPrueba() marcarTarjeta() }
} }
5
Herencia: Relaciones entre
clases Ventajas de la Herencia
l El mecanismo de herencia permite extender l Subclases proveen comportamiento
una clase (agregar variables o métodos) especializado en base a la superclase
l Si B extiende a A, entonces B hereda todo lo l Los programadores pueden definir clases
de A (la superclase), siendo la clase abstractas, que definen un comportamiento
genérico, que debe ser específicamente
heredera B una subclase de A definido por las clases herederas
l Una subclase heredera puede implementar a l En resumen, representan un mecanismo de
su manera un método heredado (override) reutilización de interfaces y código
Subclase
6
Clases y Métodos Virtuales Polimorfismo en C++
class figura {
l A veces, la jerarquía de clases hace que para una // ...
public:
clase particular, no tenga sentido la creación de virtual void rotar (int) = 0;
virtual void dibujar (void) = 0;
objetos. // ...
};
l En tal caso, la clase puede definir el prototipo de
métodos genéricos que son implementados en class circulo: public figura {
real radio;
todas las clases derivadas. public:
void rotar (int) {} // anula figura::rotar
l Tales métodos se denominan métodos virtuales. void dibujar (void); // anula figura::dibujar
circulo (punto p, real radio);
l La clase que posee estos métodos se denomina clase };
virtual.
l Los métodos virtuales pueden tener una implementación figura *f[100];
...
por defecto. for (int i=0; i<n; i++)
f[n]->dibujar();
7
Orígenes del Lenguaje Java Tecnología Java
l 1991. James Gosling inicia proyecto para escribir l Lenguaje de Programación
código independiente de plataforma para sistemas l Orientado a objetos
empotrados. Intenta con C++, pero no le satisface
l Sintaxis similar a C++
l 1993. Desarrolla un nuevo lenguaje llamado OAK,
similar a C++, pero portable y seguro l Plataforma
l 1994. Aparece WWW y Mosaic l Máquina Virtual Java (JVM)
l 1995. Sun anuncia disponibilidad de lenguaje Java l Java API
y browser HotJava, que soporta applets l Tres versiones
l 2004. Versión J2se1.5-Beta disponible. Incluye l J2SE
programación genérica como parte del lenguaje l J2EE
l J2ME
Un Primer Programa de
Aplicación Java Aplicación
l Le dice al sistema que ejecute la función /**
main de alguna clase * La clase HolaMundoApp implementa una aplicación
* que despliega por la salida estándar “Hola Mundo”
l Carga dinámicamente otras clases que */
requiera
l Aplicaciones son consideradas confiables public class HolaMundoApp {
public static void main(String[] args) {
(no significa que lo sean) // Desplegar "Hola Mundo!"
l Pueden leer, escribir, crear o borrar archivos System.out.println(" Hola Mundo!");
}
}
8
Un Primer Programa de
Aplicación Comentarios en Java
l // texto
l Se ignora el texto hasta el final de la línea (como
C o C++)
l /* texto */
l Se ignora todo texto entre /* y */ (tipo C o C++)
l /** texto */
l Comentarios de documentación (los usa la
herramienta javadoc)
Entorno de Ejecución
9
Modelo de Ejecución del
Applet Programando un Applet
import java.applet.*;
import java.awt.*;
Servidor
Web /**
Browser * la clase HolaMundo implementa una applet que
Œ
* simplemente despliega ”Hola Mundo!".
*/
Applet
Applet public class HolaMundo extends Applet {
public void paint(Graphics g) {
JVM • // Display "Hello World!"
g.drawString (”Hola Mundo!", 50, 25);
}
}
Importación de Clases y
Página Web que Carga Applet Paquetes
<HTML> l La palabra import permite importar clases de
un paquete
<HEAD>
<TITLE>Un Programa Simple con Applet</TITLE> l En el ejemplo import java.applet:* permite utilizar
</HEAD> todas las clases del paquete java.applet
<BODY> l En el ejemplo anterior Applet es una clase del
Aqui viene la salida del programa: paquete java.applet
<APPLET CODE="HolaMundo.class" WIDTH=150 HEIGHT=25>
</APPLET>
</BODY>
</HTML>
10
Funcionalidad de Java (1/2) Funcionalidad de Java (2/2)
l Esencial ....
l Objetos, strings , números, E/S, estructuras de datos,
propiedades del sistema, fecha, hora, etc. l Threads (hebras)
Java 2 SDK
3.3 Conceptos
Básicos del Lenguaje
Java
11
Palabras Resevadas
l abstract l double int super
Variables, Constantes
boolean else
l
l break
l
l extends
interface
long
switch
synchronized y Tipos Primitivos
l byte l final native this
l case l finally new throw
package throws
l catch l float
private transient
l char l for
protected try
l class l goto public void
l const l if return volatile
l continue l implements short while
l default l import static
l do l instanceof
12
Constantes de Datos
Primitivos Constantes Literales
l 178 Entero l 178 Entero
l 178L Largo l 178L Largo l ´c´ carácter
l 045 octal l \n nueva línea
l 345.125 doble prec.
l 0X45df Hexadecimal l \u8f4d Unicode
l 234.12D doble prec.
l 234.12F simple prec. l true booleano
l 345.125 doble prec.
l 23.7e-4 doble prec. l 234.12D doble prec.
l ´c´ caracter l 234.12F simple prec.
l 23.7e-4 doble prec.
l true booleano
Orden de Resolución de
Declaración de Variables Nombres
l [modificador] tipo variable {, variable}* l Declaración local a un bloque (e.g. Loop)
l Modificador es opcional l Parámetro de un constructor o método
l Posibles modificadores: static o final
l Un miembro de una clase o interfaz
l static sólo se puede usar en campos (fields)
l Ejemplo: float[] x, y; l Tipos explícitamente importados
l Declaraciones pueden aparecer en cualquier parte l Otros tipos declarados en el mismo paquete
del código l Tipos importados implícitamente nombrados
l La visibilidad de una variable se limita al bloque en l Paquetes disponibles en el sistema host
que se declara
Valores Iniciales
l Una variable se puede inicializar en su declaración
l Ejemplo: Operadores
l final double π = 3.14159;
l Java asigna valores por omisión a los campos de
una clase si no se especifica
l Corresponde a valor 0 o null
l Variables locales de un método, constructor o
inicializador estático no se inicializan
l Una variable se inicializa cada vez que se ejecuta
su declaración
13
Precedencia y Asociatividad Precedencia de Operadores
de Operadores (1/2)
l A igual precedencia, se asocia por la izquierda,
excepto asignación que es por la derecha Unario posfijo [] . (param) ++ --
Menor precedencia
l La precedencia se pueda cambiar usando Unario prefijo ++ -- + ~ !
paréntesis Creación y cast new (tipo) exp
l Para legibilidad se recomienda usar paréntesis, Multiplicativo * / %
cuando sea posible, de manera de hacer explícita la Aditivo + -
precedencia, sin exagerar
Shift << >> >>>
l Ejemplo:
Relacional < > >= <= instanceof
while ((v = stream.next()) != null)
procesar(v); Igualdad == !=
Precedencia de Operadores
(2/2) Expresiones
l Una expresión se evalúa de izquierda a derecha
l AND al bit &
l Orden puede ser importante cuando existen efectos
Menor precedencia
14
Operadores de Incremento y
Operadores Aritméticos Decremento
l Se soporta para todos los tipos de números l Operador de incremento
l Suma + l a++ equivale a a = a+1
15
Sentencias y Bloques
l Un bloque básicamente se compone de:
Control de Flujo l Sentencias de expresión
l Asignación
l Formas de prefijo o postfijo de ++ y --
l Llamadas a métodos ( objeto.metodo(...) )
l Creación de objetos (con new)
l Sentencias de declaración
l Variables requieren de inicialización
l Toda sentencia se termina con ;
l Un bloque se forma con { y }
16
Sentencia break Sentencia continue
l Permite salir desde l La sentencia continue permite saltar al final
cualquier bloque, no buscar: del cuerpo de una repetición y evaluar la
sólo switch for(y=0; y<MAX; y++) {
for (x=0; x<MAX, x++) { condición de término
l Se usa para terminar if (Matriz[x][y] == valor) { l Se usa para ignorar una elemento de
una repetición como encontrado = true;
break buscar; proceso
for, while o do }
l Se puede usar una } while (! stream.eof ()) {
} elem = stream.next();
etiqueta para salir de if (elem == “ “ || elem == “ \n”)
if (! encontrado)
un anidamiento de System.out.println (“no está”); continue;
bloques procesar(elem);
}
Sentencia return
l Permite terminar la ejecución de un método y
retorna al invocador. 3.4 Clases y Objetos
l Si no retorno valor: return;
l Si retorna valor: return valor; Clases, miembros, constructores,
control de acceso
17
Modificadores de la Clase Variables Miembros
l Las variables de clases se denominan tb. campos
l public
l Cada objeto de una clase tiene sus propias instancias de cada
l Por omisión una clase sólo es accesible por variable miembro
clases del mismo paquete, salvo que sea l Significa que cada objeto tiene su propio estado
declarada pública l Cambio de estado en un objeto no afecta a otros objetos
similares
l abstract l Variables miembros se pueden compartir entre todos los objetos
l La clase no puede ser instanciada de una clase con el modificador static
l Todos los objetos de una clase comparten una única copia de
l final un campo declarado como static
l La clase no puede ser derivada l En general, cuando se habla de variables y métodos miembros
se refiere a aquellos no estáticos
18
Razones para usar
Ejemplo de Constructor Constructores
class Persona { l Algunas clases no tienen un estado inicial razonable
private static int nextID = 0; sin inicialización (e.g. tope = -1)
private int ID;
private String Nombre; l Proveer un estado inicial conveniente y razonable
Constructor (e.g. Nombre = “Juan”)
public Persona (String s) { l Construir un objeto puede ser costoso
ID = ++nextID;
Nombre = s; (e.g. objeto crea tabla interna a la medida)
} l Por motivos de seguridad de acceso
public int getID() { (e.g. constructores pueden ser privados o
return ID; protegidos)
}
} l Si no se define un constructor, el compilador agrega
uno por defecto.
Ejemplo de Múltiples
Métodos
Constructores
class Persona { l Un método se entiende para manipular el estado del
private static int nextID = 0;
private int ID; objeto (variables miembro)
private String Nombre; l Algunas clases tienen variables miembro públicas,
private int edad = -1;
lo que permite su manipulación directa por otros
public Persona (String s) { objetos, pero no es seguro
Segundo ID = ++nextID;
Nombre = s; l Cada método se llama con la siguiente sintaxis:
constructor
} referencia.metodo(args)
public Persona(String s, int ed) { l Java no permite un número variable de argumentos
this(s ); como C o C++
edad = ed;
} Invoca
Constructor
//... Otros métodos anterior
}
19
Métodos: Valores de Control de Acceso con
Parámetros Métodos
l En Java todos los parámetros se pasan por l Para proteger campos de un acceso externo se usa
el modificador private
valor (tanto primitivos como referencias)
l Java no provee un modificador que sólo permita
l Es decir, se pasa una copia del dato al método lectura de un campo
l Si el parámetro es una referencia, es la l Para asegurar acceso de sólo lectura se debe
referencia la que se copia, no el objeto introducir un nuevo método que lo haga
indirectamente y en forma segura
l Por lo tanto, un cambio de estado del objeto l Este tipo de métodos se denominan accesor
referenciado realizado por el método será visible
l Es recomendable usar accesores para proteger el
después del retorno estado de los objetos
20
Usos de this Usos de this
class Hijo{
Bloques de Inicialización
Ejemplo: Método Estático Estática
estático l Permiten a una clase inicializar variables
public class PruebaUsoStack {
int x=0; miembro estáticas u otros estados necesarios
public static void main(String[] args) { l Se ejecutan dentro de una clase en el orden que
Stack st = new Stack(5);
aparecen declarados
st.push ("Hola"); l Ejemplo:
Clase st.push(args[0]);
class Primos {
System String s; protected staticint[] PrimosConocidos = new int[4];
miembro while (st.size()>0) {
estático out s = st.pop(); static {
System.out.println(s); PrimosConocidos[0] = 2;
} for (int i = 1; 1 < PrimosConocidos.length; i++)
System.out.println(x ); PrimosConocidos[i] = ProximoPrimo();
} }
ERROR
} }
21
Recolección de Basura Método finalize
l Java realiza recolección automática de basura, i.e. l Permite ejecutar un método de finalización antes de
el programador no requiere liberar explícitamente liberar memoria
los objetos l Es el equivalente al concepto de destructor en C++
l Sólo existe new (no delete como C++)
l Es útil cuando se usan recursos no de Java y que
l Objeto que se detecta sin referencia, el sistema lo libera deben liberarse (evitar fuga de recursos)
l Ventajas l Ejemplo: Cerrar archivos abiertos
l No requiere invocar al administrador de memoria para l Forma de declararlo:
liberar cada objeto
l No se produce el problema de dangling protected void finalize() throws Throwable {
super.finalize();
// ...
}
22
Métodos Nativos Clases Anidadas
l Permite que programas Java usen código no l Java permite definir una clase como miembro
escrito en Java de otra clase
l Se implementa el método en lenguaje nativo (e.g. l Útil cuando una clase tiene sólo sentido en el
C ó C++) contexto específico de una clase
l El método se invoca desde Java l Clase anidada tiene acceso total a todas los
l Se pierde la portabilidad y seguridad de Java miembros de la clase a que pertenece (como
lo haría cualquier otro método miembro de la
l Se aplica para manipular hardware clase superior)
Resumen
l Objeto y Clase
l Miembros (métodos y variables) 3.5 Herencia
l Creación de objetos y constructores
l Control de acceso Extensión de clases, redefinición
l Sobrecarga de métodos y constructores de miembros, constructores,
l Miembros estáticos clases y métodos abstractos,
l Métodos especiales (finalize, main, toString) clase Object
l Clases anidadas
23
Conceptos Preliminares Clases Extendidas
l En general, una clase define un contrato de uso a l En Java todas las clases son extendidas
través de sus miembros accesibles y el l Toda clase se deriva (quizás indirectamente) de la clase
Object
comportamiento esperado de los métodos
l La clase Object implementa el comportamiento que
l Una clase extendida agrega funcionalidad, requiere todo objeto Java
creándose una nueva clase, con un contrato l Java sólo permite tener una única superclase
extendido (herencia simple )
l No se cambia el contrato que se hereda de la l Si no se especifica extends se supone que se deriva de
superclase, sino que se extiende
Object
l Si se puede cambiar la implementación de algunos
métodos heredados, pero respetando el contrato de la
superclase
24
Redefinición (overriden) de Métodos Redefinición (overriden) de Métodos
(1/3) (1/3)
public class Traductor {
l Para la definición de métodos donde existe public String traducir(String palabra){
...
coincidencia de nombres: }
}
l Sobrecarga: Definir más de un método con el mismo class MultiTraductor extends Traductor{
nombre, pero con diferente firma public String traducir(String palabra, String idioma){
...
l Redefinición . Reemplaza la implementación de la }
}
superclase
class TraductorMandarin extends Traductor{
l Firma y tipo del retorno deben ser idénticas public String traducir(String palabra){
...
l Permite modificar o complementar el comportamiento }
de un método de la superclase }
Constructores en Clases
Ejemplo de Redefinición de
Extendidas
Miembros (2/2)
public class SuperClase { public class SubClase extends SuperClase { l Al crear un objeto, el orden de ejecución es:
public String str = "SuperClase.str"; public String str = "SubClase.str ";
l Se invoca el constructor de la superclase
void mostrar() { void mostrar() {
System.out.println( super.mostrar(); (sino se especifica cual, se usa el por omisión)
"SuperClase.mostrar = " + str); System.out.println(
} "SubClase.mostrar = " + str); l Inicializar los campos usando sentencias de inicialización
} }
public static void main(String[] args) { l Ejecutar el cuerpo del constructor
SubClase sub = new SubClase();
SuperClase sup = sub;
sup.mostrar(); l Si se quiere usar un constructor específico de la
Resultado de Ejecución sub.mostrar();
SuperClase.mostrar = SuperClase.str System.out.println("sup.str = " + sup.str); superclase debe invocarse con super(...)
SubClase.mostrar = SubClase.str System.out.println("sub.str = " + sub.str);
SuperClase.mostrar = SuperClase.str }
}
SubClase.mostrar = SubClase.str
sup.str = SuperClase.str
sub.str = SubClase.str
25
Ejemplo de Constructor (1/2) Ejemplo de Constructor (2/2)
public class subclase extends superclase {
private int Z = 3 ;
public class superclase { public subclase() {
protected int X = 1; System.out.println("subclase antes: Y = " + Y);
protected int Y ; Y = Z;
System.out.println("subclase despues : Y = " + Y);
}
public superclase() { }
System.out.println("superclase: antes Y = " + Y);
Y = X; public class principal {
public static void main(String[] args) {
System.out.println("superclase: después Y = " + Y); System.out.println("Inicio de principal");
} subclase z = new subclase();
System.out.println("Fin de principal");
}
public int getY () {
}
Resultado de Ejecución:
return Y;
Inicio de principal
} superclase: antes Y = 0
} superclase: despues Y = 1
subclase antes: Y = 1
subclase despues: Y = 3
Fin de principal
26
Métodos equals y hashCode Métodos equals y hashCode
public class Persona {
l Los métodos equals y hashCode deben ser private String rol;
private String nombre;
Ejemplo de Igualdad de
Valores Clonación de Objetos
l El método clone permite clonar un objeto
public class Igualdad {
l En principio, cambios posteriores en el clon no afectan al
public static void main(String[] args ) { estado del objeto original
Integer Un = new Integer(1), otroUn = new Integer(1);
l Una clase que permite clonar objetos normalmente
if (Un.equals(otroUn)) implementa la interfaz Cloneable
System.out.println("objetos son iguales");
if(Un == otroUn) l Aquellas clases que tienen variables miembros que
System.out.println("objetos son idénticos"); son referencias deben redefinir el método clone
}
l Agrega profundidad
}
27
Cuándo y cómo extender
Ejemplo de Clase Abstracta Clases?
abstract class ObjectoGrafico { class Circulo extends ObjectoGrafico {
int x, y; void dibujar() { l Una clase que se extiende sigue siendo del tipo
. . .
void mover(int nuevoX , i n t nuevoY) { }
. . .
de la superclase (isA), no viceversa
. . . } l Ejemplo: Se se deriva pixel de punto, un pixel es un
}
class Rectangulo extends ObjectoGrafico { punto, pero un punto no es un pixel
abstract void dibujar(); void dibujar() {
} . . . l A veces se extiende agregando nuevos
}
}
miembros (hasA)
l Ejemplo: Un círculo tiene un punto, pero no es un
círculo.
...
ObjetoGrafico [] arreglo; l En casos que la extensión permite tener
... diferentes roles es más conveniente usar
for(int i=0;i<arreglo.length;i++) agregación
arreglo[i].dibujar();
... l Ejemplo: Una persona que tiene roles diferentes no es
simple extenderla por derivación
Resumen
3.6 Interfaces y
l Definición de Interfaz
l Herencia Múltiple
Paquetes
l Supertipos y Subtipos
Interfaces, implementaciones,
paquetes, organización de
archivos
Introducción
l Mecanismo de Interfaz es una manera de declarar
3.6.1 Interfaces tipos consistentes sólo de métodos abstractos y
constantes
Declaración, Herencia múltiple, l Clases deben implementar los métodos de las
interfaces
supertipos y subtipos,
l Las interfaces son útiles para el diseño
implementación l Clases deciden cómo implementar
l Una interfaz puede tener muchas implementaciones
28
Interfaz vs. Clase Abstracta Ejemplo de Interfaz (1/2)
l Interfaz es una simple lista de métodos abstractos l Clase que puede monitorear variación de precios de las acciones
(no implementados) l ObservadorAcciones es una interfaz de un observador
l Método cambioValor permite ser notificado de cambio precio
l Una interfaz se diferencia de una clase abstracta
l Un objeto de una clase que implementa esta interfaz se registra con
en: método observarAcciones para ser notificado de cambios
l Una interfaz no puede implementar ningún método, una l accionMon permite definir la acción que interesa observar y delta la
clase abstracta si lo puede variación que ese considera interesante
l Una clase puede implementar varias interfaces, pero
puede tener una única superclase public class MonitorAcciones {
public void observarAcciones (ObservadorAcciones observador,
l Una interfaz no puede ser parte de una jerarquía de clases String accionMon, double delta) {
...
l Clases no relacionadas pueden implementar una misma }
interfaz }
void cambioValor(String accionMon , double nuevoValor); l public hace pública la interfaz fuera del paquete
} Método
(opcional)
l La interfaz puede extender varias interfaces
Cuerpo de la Interfaz (opcional)
Implementación de una
Cuerpo de la interfaz Interfaz
l Todas las constantes son implícitamente: l Una interfaz define un conjunto de métodos.
l públicas,
l estáticas y l Una referencia a una interfaz permite
l finales suponer que los métodos existen
l Todos los métodos son implícitamente: l Una clase que “implementa” una interfaz se
l públicos y
compromete a “implementarlos”.
l abstractos
l No se aceptan otros modificadores (e.g. private, l Definir código para cada uno de ellos.
protected y synchronized) l Incumplimiento de contrato implica imposibilidad
de crear instanciasàclase abstracta
l Se deja la responsabilidad a los hijos.
29
Implementación de una Implementación de una
Interfaz Interfaz
public interface ObservadorEventos { public class Agenda {
Implementación de una
Interfaz Herencia Simple vs. Múltiple
l Una clase puede extender exactamente una
public static void main(String args[]){ superclase
Agenda a = n e w Agenda();
l Una interfaz puede extender múltiples interfaces
Persona p = new Persona("NN", "112233");
Asistente asist = new Asistente(); l Herencia múltiple con clases puede producir
a.agregarObservador(p ); problemas debido a diferentes implementaciones
a.agregarObservador(asist );
l Ejemplo: W
a.nuevoEvento ("reunion");
l W tiene un campo wVar
} Y X
l Si Z hace referencia a wVar,
cuál es? Existen dos wVar?
Z
Ir a tomar la micro para la ‘reunion’!
Avisarle al jefe antes de las Mon Apr 05 17:08:49 VET 2004!! l Java evita el problema permitiendo sólo herencia
simple para clases
30
Ejemplo de Interfaz Extendida Ejemplo de Interfaz Extendida
(2/3) (3/3)
public class ControladorHDDs implements AdministradorES {
l Para constantes es simple: se selecciona cada una l Problema anterior se soluciona definiendo una
usando nombre de la interfaz subinterfaz con el nuevo método
l Ejemplo: X.var, Y.var
l java.lang.Comparable pid=++lastPid ;
priority=0;
l compareTo(Object o)
}
l java.lang.Cloneable public i n t getPid (){return p i d;}
l Vacia! public void nice( int p){priority+=p; }
}
}
31
Ejemplo de Implementación de
Interfaz (2/2)
class DemoIterador implements java.util.Iterator {
private String[] Cartas = {
"2","3","4","5","6","7","8","9","10" ,"Sota", "Reina", "Rey","As" } ;
private int actual = 0;
32
Colisiones de Nombre entre Colisiones de Nombres de
Paquetes Paquetes
l Si se usa más de un paquete se pueden producir colisiones de l Si dos paquetes tienen el mismo nombre y
nombre.
l Para controlar el uso correcto se puede usar: requieren ser usados existe un problema
l 1. Anteponer el nombre del paquete en aquellos casos de l Una solución es usar nombres anidados
colisión (e.g. Personas.Persona)
l 2. Importar en forma completa un solo paquete y usar nombres l Ejemplo: miproyecto.mipaquete.*
completos para los nombres que colisionan
l Caso real l En grandes organizaciones se acostumbra a
l java.util.Date y java.sql.Date usar nombres de dominio de Internet en
orden inverso
l Ejemplo:
import Personas.* l Ejemplo: cl.utfsm.siga.mipaquete.*
// OtrasPersonas.Persona se refiere al otro paquete
// Persona se refiere ahora a Personas.Persona
~home/
usm/
lp/
agenda/
Agenda.java
Persona.java
....
33
Paquetes de Java Extensiones a Java
l java.lang l javax.swing
• java.rmi l javax.servlet
l java.io
• java.applet l javax.crypto
l java.util l javax.accessibility
• java.sql
l java.math l javax.naming
• java.beans javax.transaction
l java.awt l
• java.security l javax.xml
l java.net
• etc. l javax.sound
l javax.print
l etc.
Resumen
3.7 Caracteres, String
y Otros Tipos de
l Definición de Interfaz
l Herencia Múltiple
Datos
l Conflictos de Nombres
Arreglos, Character, String,
l Supertipos y Subtipos StringBuffer, Number, Date
l Implementación de Interfaces
l Paquetes
l Control de Componentes de Programas
Arreglos en Java
l Arreglos en Java son agrupaciones ordenadas de
3.7.1 Arreglos elementos
l Los elementos pueden ser tipos primitivos o
referencias (incluso referencias a otros arreglos)
l Las dimensiones de un arreglo se omiten en la
declaración de variables
l La dimensión se determina en la creación del arreglo
l Tamaño permanece fijo después de su creación
l Los índice varían desde 0 a largo-1
l Acceso ilegal lanza IndexOutOfBoundsException
l Los arreglos no se pueden derivar
34
Ejemplo de un Arreglo Uso de Arreglos
l Declaración de un Arreglo (sin tamaño)
public class demoArreglo {
l tipo[] variable;
public static void main(String[] args) { l Creación de un arreglo vacío (especifica tamaño)
// declarar un arreglo de enteros
int[] unArreglo; l variable = new tipo[tamaño];
// crear un arreglo de enteros
unArreglo = new int[10]; l Creación e inicialización rápida
// asigna un valor a cada elemento del arreglo e imprime
for ( int i = 0; i < unArreglo.length ; i + +) { l tipo[] variable = {val0 , val1 , ... , valn-1 };
anArray[i ] = i;
System.out.print(unArreglo[i] + " ") ; l Acceso a un elemento del arreglo
}
System.out.println();
l variable[indice]
}
}
l Tamaño del arreglo
l variable.length
35
Clases Básicas para
Caracteres
3.7.2 Caracteres y
l Character.Clases cuyas instancias pueden
Strings mantener un único valor (wrapper)
l String. Clase para almacenar y manipular
datos inmutables compuestos de múltiples
caracteres
l StringBuffer. Clase para almacenar y
manipular datos mutables compuestos de
múltiples caracteres
36
Métodos Accesores Métodos Específicos de
(Comunes) String
l int length() l indexOf(int caracter ),
lastIndexOf(int caracter )
l Obtiene el largo del String o StringBuffer
l Retorna índice de la primera (última) ocurrencia de caracter
l char charAt(int pos) l indexOf(int car , int desde) ,
l Obtiene carácter en posición pos. 0 es el primero y lastIndexOf(int car, int desde)
length()-1 el último l Retorna índice de primera (última) ocurrencia de carácter,
buscando hacia delante (atrás) desde índice especificado
l String substring(int), String substring(int, int) l indexOf(String str),
lastIndexOf(String str )
l Obtiene parte del String
l Retorna índice de la primera (última) ocurrencia del String str.
l Los dos enteros indican primera y última posición. Sino se l indexOf(String str, int desde ),
indica segundo entero, se asume hasta el final lastIndexOf(String str , int from)
l String toString() l Retorna índice de primera (última) ocurrencia de String str ,
buscando hacia delante (atrás) desde índice especificado.
l Convierte a string
Métodos Específicos de
String Métodos de StringBuffer
l int compareTo(String otroString)
l StringBuffer append(String str)
l Compara dos lexicográficamente(interfaz Comparable)
l Agrega str al final del buffer de string.
l String concat(String str)
l int capacity()
l Concatena el string str al final
l Retorna la capacidad actual del buffer de string
l String toLowerCase() l StringBuffer insert(int offset, String str)
l Convierte un String a minúsculas
l Inserta str en la posición offset del buffer de string.
l String toUpperCase() l StringBuffer delete (int inicio, int fin)
l Convierte un String a mayúsculas l Elimina los caracteres entre inicio y fin
l etc. l etc.
l VER: l VER:
http://java.sun.com /j2se/1.4/docs/api/java/lang /String.html http://java.sun.com /j2se/1.4/docs/api/java/lang /StringBuffer.ht
ml
Clase Number
l byte byteValue()
3.7.3 Números l
l Retorna el valor del número
double doubleValue()
especificado como byte
37
Clases Extendidas de
Number Funciones Matemáticas
l Byte. Clase envolvente para byte l El paquete java.lang.Math contiene funciones tales
l Double. Clase envolvente para double como:
l Float. Clase envolvente para float l exponenciación
l logaritmos
l Integer. Clase envolvente para int l raíz cuadrada
l Long. Clase envolvente para long l Funciones trigonométricas
l Short. Clase envolvente para short l Máximos y mínimos
l BigDecimal. Número decimal de precisión arbitraria l Redondeos
l BigInteger. Número entero de precisión arbitraria l etc.
l Ver
l http://java.sun.com /j2se/1.4/docs/api/java/lang /Math.html
Formatos de Números
l Los programas almacenan y operan números en
forma independiente de la localidad 3.7.4 Date
l Al desplegar los valores con toString se debieran
hacer en el formato de la localidad
l Inglés: 123456.78 Fecha y hora
l Francés: 123 456,78
l Alemán: 123.456,78
l Java provee soporte para realizar tales
conversiones en paquete java.text
l NumberFormat
l DecimalFormat
Clase java.util.Date
3.8 Manejo de
l Útil para manejar datos fecha/hora
l Constructor por defecto entrega fecha actual Excepciones
l Operaciones
l Comparación Excepciones, clasificación,
l Suma lanzamiento y manejadores de
l Formato excepciones
l Clase utilitarias
l java.util.Calendar
l java.text.DateFormat
38
Motivación Concepto de Excepciones
l Cuando ocurren errores es importante que un l Una excepción corresponde a un evento que
programa sea capaz de reaccionar al evento interrumpe el flujo normal de ejecución
(capturarlo) l Cuando ocurre tal tipo de evento en un método, se
l Ejemplo de acciones posibles: lanza (throw) una excepción, creando un objeto
l Notificar al usuario de un error especial que se pasa al runtime para manejar la
l Guardar el trabajo hecho excepción
l Volver a un estado seguro anterior l El runtime busca en el stack el método que maneje
l Terminar limpiamente el programa el tipo de excepción
l Ejemplos de errores: l Si se encuentra se captura la excepción invocando al
l Error en la entrada de datos manejador de la excepción (catch)
l Error en un dispositivo (e.g. Impresora apagada, disco lleno) l Si no se encuentra se termina el programa
l Error en el código
Excepciones:Comparación con
Ventajas de Excepciones Java (1/2)
l Separa el código de manejo de errores del código TipoError leerArchivo(char * m i Archivo) {
normal int errorCode = 0;
int fd;
l Hace más legibles los programas int n;
if ((fd = open(“ miArchivo ”) < 0))
l Propaga errores a través de los métodos que se return ERROR_ABRIR_ARCHIVO;
int n = largo del archivo;
encuentran activos en el stack if (n < 0) {
l Transfiere el control en el anidamiento de invocaciones al close(fd );
return ERROR_LARGO_ARCHIVO;
lugar adecuado para su manejo }
l Permite agrupar errores y diferenciar errores while ((n = read(fd ,...)) > 0)
procesar();
l Una excepción es una clase que se puede derivar if (n != EOF)
return ERROR_LECTURA_ARCHIVO;
}
39
Jerarquía de Clases de
Excepciones Jerarquía de Excepciones
l En Java toda excepción se deriva de la clase Throwable
Throwable
Throwable
l Existen dos subclase:
l Error. Representa un error interno irrecuperable o
agotamiento de recursos en el sistema de runtime de Java Error
Error Exception
Exception
l Exception. Representa una situación excepcional en el
programa. Existen dos tipos:
l Tiempo de compilación (Derivadas de Exception)
l Tiempo de ejecución (Derivadas de RuntimeException) IOException RuntimeException
.... IOException RuntimeException
Métodos: Manejo de
Excepciones Cómo lanzar una excepción?
l Un método advierte al compilador sobre excepciones que no
puede manejar lanzándola con throws
l Los pasos son:
l Ejemplo: l Se debe elegir una clase apropiada de excepción
public String leerLinea() throws IOException l Crear un objeto de excepción de esa clase
l Un método debe declarar todas las excepciones verificadas l Lanzar la excepción con throw
(checked)
l Si no declara todas, el compilador reclama l Ejemplo:
l Al declarar una clase de excepciones, entonces puede lanzar
cualquier excepción de alguna subclase throw new ClaseExcepción();
l Aquellas excepciones que son capturadas ( catch) no salen del
método y no debieran ser declaradas
if (ch == -1) { // se encuentra EOF
if (leidos < tamaño)
throw new EOFException();
}
40
Ejemplo: Lanzamiento de Creación de Clases de
Excepción Excepciones
l Si las excepciones estándares no son adecuadas, el
usuario puede definir las propias, derivando alguna clase
public Object pop() throws EmptyStackException { existente
Object obj;
l Es práctica común definir un constructor de omisión y otro
con un mensaje detallado
if (size == 0)
l Ejemplo:
throw new EmptyStackException ();
obj = objectAt(size - 1); class FileFormatException extends IOException {
setObjectAt(size - 1, null); public FileFormatException () {
size--; }
return obj;
public FileFormatException(String msg) {
} super (msg);
}
}
Ejemplo: Manejadores de
Excepciones Relanzando una Excepción
Graphics g = imagen.getGraphics();
try {
try {
// código que lanza excepciones
. . .
} catch (MalformedURLException e) {
} catch (ArrayIndexOutOfBoundsException e) {
g.dispose();
System.err.println ("Agarró ArrayIndexOutOfBoundsException : " +
throw e;
e.getMessage());
}
} catch (IOException e) {
System.err.println ("Agarró IOException: " +
e.getMessage()); Relanza la excepción
}
capturada por el
manejador de
MalformedURLException
41
Cláusula finally Ejemplo de finally
public void writeList() {
l Cuando se lanza una excepción se detiene el PrintWriter out = null;
try {
procesamiento normal del método System.out.println("Entering try statement") ;
out = new PrintWriter(new FileWriter ("OutFile.txt") ) ;
l Esta situación puede ser un problema si el método ha if (size < 0)
adquirido recursos return;
for ( int i = 0; i < size; i++ )
out.println(" Value at : " + i + " = "
l Se hace necesario disponer de un código de limpieza + victor.elementAt(i));
} catch ( ArrayIndexOutOfBoundsException e) {
l La solución es usar la cláusula finally, que se System.err.println("Caught ArrayIndexOutOfBoundsException: "
+ e.getMessage());
ejecuta haya o no excepción antes de retornar } catch ( IOException e) {
System.err.println("Caught IOException: " + e.getMessage ());
l En caso de capturar una excepción, el código de manejo } finally {
if (out ! = null) {
se ejecuta antes que el de finally System.out.println("Closing PrintWriter" );
out.close ();
l Finally se ejecuta siempre, incluso si se alcanza un return } else
System.out.println("PrintWriter not open ");
en condiciones normales. }
}
Resumen
3.9 Streams y
l El mecanismo de excepciones permite transferir el
control cuando suceden errores en el programa Archivos
l El código de manejo de los errores se puede
separar del código de desarrollo normal Streams, clases, archivos,
l Cada método debe declarar las excepciones streams de objetos y
verificadas (checked) que no puede manejar, de
manera que los programadores sepan al usar la
serialización
clase que excepciones pueden esperar
42
API de InputStream (1/2) API de InputStream (2/2)
l abstract int read() l long skip(long n)
l Lee un byte de entrada (retorna -1 se llega al final) l Salta n bytes en la entrada (retorna # de bytes saltados)
l int read(byte[] b) l int avalaible()
l Lee un arreglo de bytes (lee a lo más b.length bytes) l Retorna # de bytes disponibles sin bloquear
l Retorna bytes leídos (retorna -1 si está al final) l void close()
l int read(byte[] b, int off, int largo) l Cierra entrada
l Lee un arreglo de bytes (lee a lo más b.length bytes) l void mark(int lim)
l Retorna bytes leídos (retorna -1 si está al final) l Coloca marca en posición actual. Se borra al leer lim bytes
l off: offset en arreglo b l void reset()
l largo: Máximo # de bytes a leer l Vuelve a posición de última marca
l boolean markSupported()
l retorna verdadero si soporta marcas
43
Subclases de InputStream y
OutputStream Composición de Streams
l Los streams se pueden componer para lograr la
funcionalidad deseada
l Ejemplo:
l FileInputStream permite leer bytes desde un archivo
l Java provee algunas clases que permiten ensamblar bytes
en tipos de datos útiles (e.g. DataInputStream y
PrintWriter)
l Java permite combinarlos para lograr, por ejemplo leer
números de un archivo
Ejemplos de Streams de
Filtrado
FileInputStream fin = new FileInputStream(“miArchivo.txt”)
DataInputStream din = new DataInputStream(fin); 3.9.2 Archivos
double d = din.realDouble();
l FileDescriptorfd = ...;
FileInputStream in = new FileInputStream(fd);
44
Ejemplo: Copia de Archivo Clase File
import java.io.*;
l No corresponde a un stream (se deriva de
public class Copy {
public staticvoid main(String[] args) throws IOException { Object), que permite tener repesentación
File archivoEntrada = new File(”Entrada.txt"); abstracta de archivos y directorios
File archivoSalida = new File(”Salida.txt");
Streams de Buffering
3.9.3 Streams
l BufferedInputStream
Especiales l Permite usar buffer de entrada para leer sin
causar un acceso a dispositivo en cada operación
l BufferedOutputStream
l Idem para salida
l PushbackInputStream
l Permite devolver datos al stream
45
Clases DataInput y DataOutput Clase PrintWriter
l boolean void writeBolean(boolean b) l Permite escribir texto formateado
readBoolean () void writeByte(byte b) (no se especifica destinatario)
l byte readByte() void writeChar(char c) l void print(Object)
l char readChar() void writeChars(String s)
l void print(String s)
void writeDouble (double d)
l double readDouble() l void println(Strings)
void writeFloat(float f)
l float readFloat() void writeInt(int i) l void print(char[] s)
l int readInt() void writeLong (long l) l void print(char c)
l String readLine() writeShort(short s) l void print(int i)
l long readLong() l etc.
l short readShort ()
¡Leen y escriben en binario! ¡Java no provee un stream similar para entrada formateada!
br = new java.io.BufferedReader(
new java.io.InputStreamReader(System.in));
String str = br.readLine();
Java no provee un stream similar para entrada formateada System.out.println("Ud ingreso "+str);
}catch(java.io.IOException ioe ){
}
46
Patrones de diseño Factory
l Son formas convenientes de reutilizar código l Una “fábrica” es un patrón que devuelve una
orientado a objetos entre proyectos y instancia de una clase entre un conjunto de
programadores posibilidades dependiendo de la información
l Promueven que los objetos se ocupen solo de “sus proveída.
propios asuntos”. l Generalmente devuelve una clase abstracta
l Un patrón aborda un problema de diseño recurrente o una interfaz.
que aparece en situaciones especificas y que l El programador no sabe que instancia
represente una solución a este. específica esta usando.
i f (i > 0 ) { i f (i > 0 ) {
abstract class Namer{ first=s.substring(0, i).trim(); last=s.substring(0,i).trim();
return last;
}
}
Last: Perez
First: Maria
Last: Espinoza
47
2º Ejemplo de Factory (1/4) 2º Ejemplo de Factory (2/4)
class NetLogger extends AsbtractLogger{
l Fabrica de objetos para realizar loggin public NetLogger(URL destiny, int minLevel){
}
interface Logger{
protected void doLog(String message) {
public void doLog(String message, int level);
System.out.println("[NetLogging]" +message);
}
}
abstract class AsbtractLogger implements Logger{
private int minLevel; }
48
1º Ejemplo de Singleton (2/3) 1º Ejemplo de Singleton (3/3)
public class PrintSpooler { public static void main(String[] args) {
return null;
} ps3 = PrintSpooler.newSpooler();
} }
if(instance== null )
instance = n e w DBConnection(defaultSetup);
return instance;
}
instance= null ;
Patrones de diseño
2º Ejemplo de Singleton (3/3) empresariales
l Principalmente para aplicaciones
public static void main(String[] args) {
distribuidas.
DBConnection dbc1, dbc2;
dbc2 = DBConnection.getConnection();
l Mantienen complejidad baja y alta
mantenibilidad en sistemas web integrados
if(dbc1==dbc2)
49
View Helper View Helper
l Motivación
l Los cambios en las capas de presentación son usuales.
l Son difíciles de desarrollar y mantener cuando la lógica de
acceso a datos del negocio y la lógica de formatos de
presentación están mezclados.
l Se requiere una separación clara de las tareas
l Solución
l Una vista (View) contiene el código de formato,
delegando las responsabilidades de procesamiento a
una clase que la asiste (Helper).
50
Data Access Object Data Access Object
l Motivación
l Las aplicaciones requieren de datos persistentes
Data Access
Object Ejemplo completo
l DAO para recuperar productos e usuarios
l XML
l Base de datos
l Web service
l Componentes del negocio para listar y
vender productos
l Fachada para encapsular funcionalidad
l Cliente que accede a los servicios
}
public int getPK(){ return rut; }
public boolean store() throws SQLException{
public void setNombre(String n){nombre=n; } int rut = this.user.getPK ();
} return false;
return null;
}
}
51
DAO para usuarios DAO para productos
public static void main(String args []){ public class Product {
class ProductRetriever{
else
l Un componente para agrupar tareas de throw new IllegalArgumentException
...
...
}
52
Componentes del negocio Fachada de listado y venta
public class ProductFacade {
class ProductManager{ private ProductRetriever retriever=new ProductRetriever();
ProductDAO pDao = null; private ProductManager manager = new ProductManager();
...
}
}
}
}
bean.setProducts(retriever.getProducts()); try{
bean.setUserProducts(retriever.getUserProducts(loggedUser )); p=retriever.getProduct(pCode);
return bean; }catch (IllegalArgumentException iae){
} return false;
}
manager.dispatchProduct(p, loggedUser );
return true;
} class ClientView{
} Iterator it = helper.getProducts().iterator();
} }
} }
53
Cliente Conclusiones
l Clara separación de tareas.
class ClientHelper{
private ProductFacade facade = new ProductFacade(); l Posibilidad de distribuir objetos.
public Collection getProducts(){ l Definición de paquetes
Collection c = new Vector();
l Las únicas clases publicas son “User”, “Product” y
ProductBean bean = facade.listProducts();
“ProductFacade”.
c.addAll(bean.getUserProducts());
l El cliente se define en un paquete distinto.
c.addAll(bean.getProducts());
return c ;
l El cliente solo puede acceder a la fachada.
}
}
Resumen
l Factory
l Singleton
l View Helper
l Session Facade
l Data Access Object
54