Download Tema 3. Paradigma Orientado a Objetos

Document related concepts
no text concepts found
Transcript
Lenguajes de Programación
Tema 3. Paradigma Orientado a
Objetos
Pedro García López
[email protected]/
Estudio de caso: Java
Lenguaje:
Programa Java
• Simple
Java APIs
• Orientado a Objetos
• Robusto
• Arquitectura-neutral (portable)
• Moderno
• Tipado estáticamente
• Semi-interpretado
• Gran conjunto de bibliotecas
Java Virtual Machine
Computadora
Máquina virtual
• La máquina virtual garantiza la portabilidad
del código
• Tipos de aplicaciones java:
– Standalone (main y maquina virtual)
– Applets (en la máquina virtual del navegador
– Servlets J2EE (ejecutados en un servidor de
aplicaciones Web)
Programa
Java
Compilador
Programa
Java en
Bytecode
Java para
Macintosh
01010101
Java para
Windows
01010101
Java para
Linux
01010101
Aplicaciones de Java
Sistemas embebidos
Java Server Faces
Servidor
JINI
Servlets
JavaSpaces
Java Server Pages
Programación
JNI
WWW
java.*
Applets
J2ME
Java Web Start
JavaBeans
Java3D
Programación gráfica
Programación UI
Java2D
Bases de datos
AW
T
JDBC
CORBA
Programación distribuida
Enterprise JavaBeans
RMI
Swing
SWT
Versiones de Java
Historia del lenguaje
• 1991: El proyecto secreto “Green Team” equipado con 13 personas,
fue designado por Sun para anticipar y planear las futuras tendencias
en el mundo de la informática. Este proyecto a puertas cerradas fue
impulsado por Patrick Naughton, Mike Sheridan y James Gosling.
• 1992: Se presenta Star7: una versión demo funcional de un controlador
de un dispositivo de entretenimiento familiar interactivo, con una
interfaz de usuario animada en una pantalla sensible al tacto.
Estaban tentando a las compañías de cable con la idea de cómo se
debían ver sus redes. Era interactivo, y los usuarios podían leer y
escribir información en el sistema. Pero las compañías “no querían
perder mucho control”. Era demasiado avanzado para la época, y el
equipo de desarrollo, que para ese momento ya eran 70, todavía
buscaba un mercado al que le pudiese interesar la idea.
Historia del lenguaje
• 1993: Llegó Mosaic como una manera amigable de acceso a la Web,
revolucionando la percepción del público. Internet estaba siendo
transformada en la misma red que Sun quería convencer a las
compañías de cable que deberían estar construyendo. Todas las cosas
que querían hacer en general encajaban perfectamente con la forma en
que las aplicaciones estaban escritas, entregadas y usadas en Internet.
Era simplemente un accidente increible. Y fue obvio desde ese
momento que Java y la Web eran una pareja perfecta hecha en el cielo.
• 1994: El equipo retornó para trabajar en un clon de Mosaic basado en
la tecnología Java, al cual llamaron “WebRunner” (en honor a la
película Blade Runner) y que luego se difundió oficialmente bajo el
nombre de HotJavaTM.
Historia del lenguaje
• 1995: La demo que cambió la historia: “Hollywood conoce Silicon
Valley”. Se realiza una demostración del potencial de Java a través de
una animación de una molécula.
Un mes mas tarde, el equipo estaba preparado para publicar el código
binario del navegador en su versión 1.0a, y hacerlo público para
descargas públicas y privadas en Internet. Querían que el código fuera
testeado por sus amigos y por un grupo mas o menos pequeño de gente
de una red informal de desarrolladores.
El 22 de Marzo, Lisa Poulson coordinó con el periódico San Jose
Mercury News para escribir una historia sobre la tecnología Java
basada en el lanzamiento oficial que vendría pronto. El problema: en el
artículo se mencionaba un sitio web que todavía ni existía, por lo cual
el equipo tuvo que dedicarse a montar un website en pocas horas.
Historia del lenguaje
Eric Schmidt y George Paolini establecen acuerdos con Marc
Andreessen de Netscape para integrar Java technology en el
omnipresente Netscape. Deciden revelar dicho acuerdo en esa misma
convención, lo cual le dio un giro inesperado al release.
Es allí cuando Java se introduce en Internet. Netscape 2.0 introduce la
primera JVM (Máquina virtual Java) en un navegador WWW con la
filosofía Java: “Write once, run everywhere”
• 1996: Se libera la versión JDK 1.0. Se realiza la primer conferencia
JavaOne developer. Se anuncian las tecnologías JavaBeans y Servlets.
Se anuncia el primer compilador Just-In-Time (JIT), la Java Card API
y finaliza el año con la JDK 1.1 beta.
• 1997: Aparece Java 1.1 final. Se anuncia el lanzamiento del JavaBeans
Development Kit, el Java Servlet Developers Kit, la JNDI API, los
Enterprise Java Beans, y las Java Foundation Classes.
Historia del lenguaje
• 1998: Java 1.2 (Java 2). Plataforma muy madura.
Apoyado por grandes empresas: IBM, Oracle, Inprise, HewtlettPackard, Netscape, Sun.
VISA anuncia la primera tarjeta inteligente basada en la tecnología
Java Card. Se formaliza el Java Community Process.
• 1999: Java Enterprise Edition. Java comienza a ser una plataforma de
desarrollo profesional. Sumado a esto se lanza la J2ME.
• 2000: Se anuncia el lanzamiento de la API de Java para XML y la
J2SE 1.3.
• 2001: Se publica el catálogo de patrones para J2EE. Se publica Java
Web Start 1.0
• 2002: Se publica el Java Web Services Developer Pack, más la versión
1.4 Beta de J2EE
• 2004: Se lanza la versión 1.5 de Java conocida como Tiger.
Hola Mundo
/*
* Example HelloWorld
* Prints the message "Hello, World!“
*/
public class HelloWorld {
public static void main(String[] args) {
System.out.println("Hello, world.”);
}
}
Palabras reservadas
abstract
boolean
break
byte
byvalue
case
cast
catch
char
class
const
continue
default
do
double
else
extends
false
final
finally
float
for
future
generic
goto
if
implements
import
inner
instanceof
int
interface
long
native
new
null
operator
outer
package
private
protected
public
rest
return
short
static
super
switch
synchronized
this
throw
throws
transient
true
try
var
void
volatile
while
Tipos Simples
Tipos Simples
Tamaño
Valor Mínimo
Valor Màximo
Tipos Wrapper
boolean
1-bit
-
-
Boolean
char
16-bit
Unicode 0
Unicode 216-1
Character
byte
8-bit
-128
+127
Byte
short
16-bit
-215
+215-1
Short
int
32-bit
-231
+231-1
Integer
long
64-bit
-263
+263-1
Long
float
32-bit
IEE754
IEE754
Float
double
64-bit
IEE754
IEE754
Double
void
-
-
-
Void
Sistema de tipos
© 2003 Brooks/Cole - Thomson Learning™
Arrays: tipos parametrizables
int lista [] = {1,2,3,4,5};
for (int i = 0; i< lista.length; i++){
lista[i] = lista[i] + 1;
System.out.println(lista[i]);
}
int lista2[] = new int[10];
char lista_char[] = new char[100];
char lista_char2 = {‘a’,’b’,’c’};
Los arrays en Java son de tamaño fijo y solo
indexables por enteros (0..size)
Bloques
Comandos y secuenciadores
if (expressBool) {
....
} else {
....
}
switch (selector) {
case valor1: instrucció1;
break;
selector:
case valor2: ...........
char,byte,short,int
...
default: instruccióN;
}
Comandos y Secuenciadores
• Bucles FOR:
for (<inicialització>; <continuar si
...>;<increment>)
for (int i=0; i<10; i++) {...}
• Bucles DO-WHILE
do {
...
} while (expressioBooleana);
• Bucles WHILE
while (expressioBooleana) {
...
}
Clases en Java
• Lenguaje tipado estáticamente
• Legible
• No separación en fichero interfaz e
implementación.
• Lenguaje semi-interpretado: Máquina Virtual
Java + bytecodes
• Atributos y variables de clase
• Métodos de instancia y de clase
• Incluye metaclases (Reflexión)
Ejemplo: Cuenta
class Cuenta {
private String
private int
private int
private int[]
titular;
saldo;
codigo;
ultOper;
private static int
ultimoCodigo = 0;
public static int nuevoCodigo () {return ++ultimoCodigo;}
public Cuenta (String quien) {
saldo=0; titular=quien;
codigo = nuevoCodigo(); ultOper = new int[100];}
public void reintegro (int suma) {
if (puedoSacar(suma)) saldo=saldo-suma;};
public void ingreso (int suma) {
saldo=saldo+suma;}
public int getSaldo () { return saldo; }
private boolean puedoSacar(int suma) {return (saldo >=suma);}
}
Creación de Objetos
• Constructores: métodos con el nombre de la
clase que no devuelven nada (void).
• Acceso a las variables de instancia de la
clase mediante métodos de instancia (set y
get).
Cuenta c = new Cuenta (“pedro”);
c.reintegro(10000);
c.ingreso(20000);
int x = c.getSaldo();
“
Propiedades de clase: static
class Cuenta
{
private String titular;
public static int interes=3;
public int setInteres(int cantidadPts)
{
interes= cantidadPts
}
¿ Que ocurre ?
Propiedades de clase
• No podemos acceder desde variables de
clase a variables de instancia.
// Método de clase
public static int setInteres(int cantidadPts)
{
interes= cantidadPts
}
Propiedades de clase
public class HelloWorld {
public static void main(String[] args) {
Cuenta.setInteres(12);
Math.sqrt(9);
}
}
Las propiedades de clase son válidas para
todos los objetos de la clase.
Clases Java y Ocultación de
Información
• “package”
– accesible por las clases del paquete, no
accesible a los clientes del paquete
• public
– accesible por todas las clases
• private
– sólo accesible por los métodos de la clase
• protected
– accesible por las clases del paquete y por las
subclases
Visibilidad
The class itself
Clases del mismo
paquete
Subclases de otro
paquete
No-subclases de
otro paquete
packag
public protected
e
Si
Si
Si
private
Si
Si
Si
Si
No
Si
Si
No
No
Si
No
No
No
Asignación
• Un objeto asociado a una variable cambia
cuando se evalúa una expresión de
asignación.
variable = expresión
miObjeto= otroObjeto;
• El operador = no hace una copia del objeto
Asignación y cloning
Point p = new Point (1,1);
Point p2 = p;
p2.setLocation(120,120);
//Aliasing
System.out.println("Valor de p:" + p.getX());
System.out.println("Valor de p2:" + p2.getX());
Point p3 = (Point)p.clone();
p3.setLocation(40,40);
System.out.println("Valor de p:" + p.getX());
System.out.println("Valor de p3:" + p3.getX());
Copia en Java
• La clase Object incluye el método
protected Object clone( ) {..} ..}
que implementa una copia superficial.
• Para poder clonar objetos de una clase se
debe
– Declarar que implementa la interfaz Cloneable
– Redefinir y hacer público el método clone()
– Dejar la versión original (copia superficial) o
bien hacer una copia de mayor profundidad.
Paso de Parámetros
class PassByValue {
public static void modifyPoint(Point pt, int j)
{
pt.setLocation(5,5);
j = 15;
}
public static void main(String args[])
{
Point p = new Point(0,0);
//1
int i = 10;
modifyPoint(p, i);
//2
//3
}}
Arrays y Clases
Cuenta lista_cuentas [] = new Cuenta[10];
O bien:
Cuenta lista_cuentas[];
lista_cuentas = new Cuenta [10];
¿ Qué ocurre si ahora intento hacer lo siguiente ?
lista_cuentas[0].ingreso(100);
Arrays y clases
• La inicialización del array no instancia n
objetos del tipo establecido !!!
• Los deja a null por defecto
Cuenta lista_cuentas [] = new Cuenta[10];
Cuenta micuenta = new Cuenta(“pedro”);
Cuenta sucuenta = new Cuenta(“pepe”);
lista_cuentas[0] = micuenta;
lista_cuentas[1] = sucuenta;
lista_cuentas[0].ingreso(100);
Arrays: Tipo parametrizable
int lista [] = new int[100];
lista[0]=1;
for (int i=0;i<lista.length;i++)
lista[i]=0;
int lista[] = {1,2,3,4};
Perro lista2 = new Perro[100];
lista2[0] = new Perro ();
Object lista3 = new Object [100][100];
Tipos básicos y clases
• Tipos Wrapper, una clase por cada tipo
básico, permite conversión Clase <-> Tipo
primitivo (Integer, Float, Char, Double)
int a =1;
int b= 2*3;
Integer awrap = new Integer(a);
int x = awrap.intValue();
La clase java.lang.String
• Es una clase, pero tiene facilidades con el
constructor
• Si se quiere eficiencia en la concatenación y
manejo de cadenas usar StringBuffer.
String nombre = new String(“pedro”);
Es equivalente a:
String nombre = “pedro”;
String total = nombre + ” garcia”;
Concepto de Metaclase: RTTI
• Run Time Type Identification
• Object
– Class getClass()
• Class
–
–
–
–
getFields
getMethods
getName
(...)
Cuenta c = new Cuenta(“pedro”);
Class miclase = c.getClass();
System.out.println(miclase.getName());
Agrupación de clases: Package
•
•
•
•
package pedro.utils;
import pedro.utils.*;
import pedro.*; // No es jerárquico
import pedro.utils.Cosa;
Paquetes Java
–
–
–
–
–
–
java.lang --- general
java.awt --- GUI
java.io --- I/O
java.util --- utilities
java.applet --- applet
java.net --- networking
Relaciones entre clases
Composicíón: Tiene - Un
Student
-name : String *
-gpa : float
*
Faculty
1
1
Address
-streetAddress : String
-city : String
-state : String
-zipCode : String
Relaciones entre clases
Herencia: Es -Un
Student
GraduateStudent
MasterStudent
PhDStudent
UndergraduateStudent
Clientela
Una Cuenta tiene un propietario de tipo Cliente:
Class Cuenta {
private Cliente propietario;
(…) }
Un Banco tiene N cuentas:
Class Banco {
private Cuenta lista_cuentas[];
(…) }
Herencia en Java
• public class X extends Y {...}
Sintaxis de clase
[ ClassModifiers ] class ClassName
[ extends SuperClass ]
[ implements Interface1, Interface2 ...] {
ClassMemberDeclarations
}
• La clase Object
• this y super
La clase Object
protected Object clone()
Creates and returns a copy of this object.
boolean equals(Object obj)
Indicates whether some other object is "equal
to" this one.protected
void finalize()
Called by the garbage collector on an object
when garbage collection determines that there are no
more references to the object.
Class getClass()
Returns the runtime class of an object
String toString()
Returns a string representation of the object.
Object
• Todas las clases heredan de Object
– Class Cuenta [extends Object]
• Se pueden redefinir los métodos equals,
clone y toString.
• Hay que tener mucho cuidado al comparar
objetos entre si, no es igual que comparar
tipos básicos:
int x = 3;
Cuenta c = new Cuenta(“pedro”);
int y = 5;
Cuenta d = new Cuenta(“pepe);
if (x ==y) then (…)
if (c ==d) then (…) NO !!!!
Ejemplo
Class Coche {
private String marca;
private int precio;
public Coche (String marca, int precio){
this.marca = marca;
this.precio = precio;
}
public int getPrecio(){
return precio;
}
Ejemplo
public String getMarca(){
return marca;
}
public boolean equals (Object obj){
Coche otro = (Coche) obj;
return
(otro.getPrecio()==this.precio)&&(otro.getMarca().equals(this.m
arca);
}
Ejemplo
protected Object clone(){
return new Coche (marca, precio);
}
public String toString (){
return “(“+marca+”,”+precio+”)”;
}
Ejemplo
public static void main (String args[]){
Coche micoche = new Coche (“bmw”,100);
Coche otrocoche = new Coche (“seat”,10);
if (micoche.equals(otrocoche))
System.out.println(“iguales”);
System.out.println(micoche);
}
Tipos de herencia
• Para referirse a la instancia actual usamos this y
para referirnos a nuestra clase padre usamos
super.
• Herencia de redefinición de métodos
– Refinamiento
– Reemplazo
• Herencia abstracta
• Herencia de interfaces
Ejemplo: La granja de animales
Herencia de reemplazo
Herencia de refinamiento
Clases abstractas
• Algún método no se implementa
• No podemos instanciar una clase abstracta
• La clase abstracta puede tener métodos no
abstractos
• La clase abstracta debe ser heredada.
public abstract class Figura
{
public abstract dibujar();
}
Ejemplo herencia abstracta
Cuidado con la herencia abstracta !
Si la clase Animal tiene aunque sea un método
abstracto entonces es ua clase abstracta:
Animal mianimal = new Animal (); ERROR !!!!
No podemos instanciar una clase abstracta !!
¿ Qué pasaría si hacemos :?
mianimal.habla();
Si una clase hereda de una clase abstracta ha de
implementar los métodos abstractos de la clase
padre, o será también abstracta
Polimorfismo
• Tipo estático:
– Tipo asociado en la declaración
• Tipo dinámico:
– Tipo correspondiente a la clase del objeto conectado a
la entidad en tiempo de ejecución
• Conjunto de tipos dinámicos:
– Conjunto de posibles tipos dinámicos de una entidad
Ejemplo:
A
B
D
C
E
F
oa: A; ob: B; oc; C;
te(oa) = A
ctd(oa) =
{A,B,C,D,E,F}
te(ob) = B
ctd(ob) = {B, D, E}
te(oc) = C
ctd(oc) = {C,F}
p
(antes)
(después)

Conexión polimorfa
(POLIGONO)
r
p:POLIGONO; r:RECTANGULO
(RECTANGULO)
• Cuando el origen y el destino tiene tipos diferentes:
a) asignación:
p = r;
polimorfa
-- p es una entidad
b) paso de parámetros:
comer (Animal a ) f es una rutina polimorfa, me
puedo comer cualquier animal (perro, gato, …)
• Sólo se permite para entidades destino de tipo
referencia
Polimorfismo y ligadura dinámica
• Java es un lenguaje tipado estáticamente
• La ligadura de un mensaje a un método
concreto se realiza en tiempo de ejecución
• ¿Qué versión de perímetro se ejecuta
en cada mensaje?
f= new Poligono ();
f.perimetro();
r = new Rectangulo();
r.perimetro();
f=r;
f.perimetro();
{i}
{ii}
{iii}
Ejemplo polimorfismo
Ejemplo polimorfismo (2)
Polimorfismo
Animal a = new Animal();
Perro p;
a = p;
Object x;
Perro p = new Perro();
x = p;
Perro p2 = (Perro) x;
Polimorfismo y castings
Object list [] = new Object[3];
String s = “lala”;
Perro p = new Perro();
list[0] = s;
list[1] = p;
Object x = list[0];
Perro p2 = (Perro) list[1];
Polimorfismo
Object list [] = new Object[3];
Integer i1 = new Integer(3);
int z = 74;
Integer i2 = new Integer(4);
list[0] = i1;
list[1] = i2;
Object x = list[0];
Integer r2 = (Integer) list[1];
int resul = z2.intValue();
Interfaces
• Son clases en las que todos las propiedades son estáticas y
finales y todos los métodos son abstractos.
• Permiten la herencia múltiple, y separación de
especificación e implementación.
• Se aplican las mismas reglas que la herencia de clases en
las asignaciones polimórficas
interface Persona
interface Perro
{
{
public void habla();
}
public void ladra();
}
Interfaces y herencia
public class Mutante implements Persona, Perro
{
public void habla()
{
System.out.println(“Soy una persona”);
}
public void ladra()
{
}
}
System.out.println(“GUAU”);
Interfaces y polimorfismo
Mutante m = new Mutante();
Persona p = m;
p.habla();
Perro p = m;
m.ladra();
Interfaces
class Prueba
{
public static void ladra (Perro p)
{ p.ladra();
{
public static void habla(Persona p)
{ p.habla()
}
Interfaces
Mutante m = new Mutante();
Prueba.habla(m);
Prueba.ladra(m);
No podemos instanciar una interface, pero si asignarle una
instancia de una clase que implemente esta interface:
Persona p = new Mutante;
Excepciones Java
• “Proporcionan una manera limpia de comprobar
errores sin complicar el código”
• “Proporcionan, además, un mecanismo para señalar
directamente los errores sin necesidad de usar
indicadores (atributos, parámetros)”.
• “Son lanzadas cuando se detectan situaciones
imprevistas de error”.
Excepciones Java
BufferedReader br;
int codigoProducto = Integer.parseInt (br.readLine() )
• Puede suceder algo inesperado como que:
– br represente un fichero sobre un disco flexible que se ha extraído
– br represente una conexión en red y se produzca una caída de la
red
– br represente un fichero en mal estado sobre el disco duro
– el usuario introduzca un carácter no numérico
– el usuario introduce un código numérico incorrecto
Situaciones que deben ser manejadas por
excepciones
70
Excepciones Java
• Las excepciones son objetos.
• Hay dos tipos:
– Comprobadas
– No comprobadas
• Necesidad de definir subclases de Exception o
RunTimeException.
Jerarquía de Tipos de Excepciones
Java
Object
Throwable
Error
Exception
RunTimeException
No comprobadas
Comprobadas
Excepciones Comprobadas
• Subclases de Exception
• Un método que lance una excepción comprobada,
debe especificarlo en su signatura.
• El código que invoca un método que puede lanzar
una excepción comprobada debe manejarla
mediante una cláusula try-catch.
• Situaciones comprobadas por el compilador
Excepciones No Comprobadas
• Subclases de RuntimeException
• Un método puede lanzar una excepción no
comprobada, sin especificarlo en su signatura.
• El código que invoca un método que puede lanzar
una excepción no comprobada no debe manejarla.
• Es recomendable listar todas las excepciones en la
signatura para facilitar su uso.
¿Cómo elegimos si una nueva excepción es
comprobada o no comprobada?
74
Uso de Excepciones
Comprobadas
public class ClaveNoExiste extends Exception {
public ClaveNoExiste() { super(); }
}
// método en TablaHash
public void cambiarValor (String clave, Object valor)
throws ClaveNoExiste
{ if (obtener(clave) == null)
throw new ClaveNoExiste ();
…
}
TablaHash unaTabla;
...
try { unaTabla.cambiarValor(s,v);}
catch (ClaveNoExiste e) {...} finally {...}
75
Excepciones Comprobadas
¿Qué puede hacer el cliente de un método
que lanza una excepción comprobada?
1) Capturarla y manejarla
2) Capturarla y asociarla a una de las excepciones
declaradas en el método.
3) Declararla en la cláusula throws y no manejarla, con lo
que se propaga al método que lo invocó.
Excepciones No Comprobadas
¿Qué puede hacer el cliente de un método
que lanza una excepción no comprobada?
1) Si no la captura se propaga al método que lo invocó.
2) También puede capturarla y manejarla.
3) Capturar la excepción y asociarla a una de las
excepciones declaradas en el método.
Excepciones Java
try {
“Sentencias con mensajes que pueden provocar
excepciones”
} catch (unaExcepcion e) {“codigo manejo excepción”
} catch (OtraExcepcion e) {“codigo manejo excepción”
} finally {...} // se ejecuta se lance o no una excepción
Excepciones en Java
¡Una excepción
es un objeto!
try{
//sentencias
}catch (TipoExcepcion1 e){
//manejar excepción
}catch (TipoExcepcion2 e){
//manejar excepción
} ...
Ej: cerrar ficheros
finally{
//sentencias que se ejecutan SIEMPRE
//salte o no una excepción
}
Ejemplos
public static int factorial (int n) throws NonPositiveException
{
if (n<=0) throw new NonPositiveException (“Num.factorial”);
…
}
try { Num.factorial(y);
} catch (NonPositiveException e) { … }
Ejemplos
public static int search (int [] a, int x) throws NullPointerException
NoEncontradoException
{…}
try { …;
try { x = Arrays.search(v,7);}
catch (NullPointerException e) {
throw new NoEncontradoException(); }
} catch (NoEncontradoException e) {..}
¿Debo declarar NullPointerException en la signatura?
¿Es acertado considerar la situación de elemento no
encontrado como una excepción?
Captura de excepciones no
comprobadas
try { x = y [n]; i = Arrays.search(z, x);}
catch (IndexOutOfBoundsException e) {
“manejar la excepción en el caso del acceso y[n]” }
No se sabe la procedencia exacta de la excepción no
comprobada IndexOutOfBoundsException
Restringir el ámbito de la sentencia try
Ejemplos
public class Arrays {
public static int min (int [] a) throws NullPointerException,
EmptyException
{ // EFECTO: Si a es null lanza NullPointerException, si no si a
// está vacío lanza EmptyException, si no retorna el valor mínimo
// del array a
int m;
try { m = a[0]; }
catch (IndexOutOfBoundsException e) {
throw new EmptyException(“Arrays.min”); }
for (int i = 1; i < a.length; i++) if (a[i] < m) m = a[i];
return m; }
Ejemplos
public class Arrays {
public static boolean sorted (int [] a) throws
NullPointerException, EmptyException
{ // EFECTO: Si a es null lanza NullPointerException, si no retorna
// true si el array está ordenado en orden ascendente si no false
int prev;
try { prev = a[0]; }
catch (IndexOutOfBoundsException e) { return true; }
for (int i = 1; i < a.length; i++)
if (prev <= a[i]) prev = a[i]; else return false
return true; }
Ejemplo código genérico
java.util.Collection
Collection
AbstractCollection
AbstractList
Vector
Stack
ArrayList
AbstractSet
LinkedList
ArraySet
HashSet
Ejemplo: código genérico
•
•
•
•
•
•
•
•
•
•
•
•
boolean add(Object)
boolean addAll(Collection)
void clear()
boolean contains(Object)
boolean containsAll(Collection)
boolean isEmpty()
Iterator iterator()
boolean remove(Object)
boolean removeAll(Collection)
boolean retainAll(Collection)
int size()
Object[] toArray()
Iteradores
•
•
•
•
boolean hasNext()
Object next()
void remove() [implementación opcional]
Por ejemplo:
public void escribir (Collection c) {
for (Iterator it=c.iterator();
it.hasnext();) {
System.out.println(it.next());
}
}
Genericidad y Java
• Java no posee genericidad (hasta el Jdk1.5)
• Necesidad de declaraciones de tipo Object
• Problemas:
– Necesidad de conversiones de tipo
– No se asegura homogeneidad
• Incluye genericidad para arrays
private Cuenta[ ] cuentas = new
Cuenta[100]
private int[ ] valores = new int [4]
Estructuras de datos polimorfas
• Contiene objetos de diferentes clases
• Ejemplo: Array con cualquier variante de Figura
Figura conjFig = new Figura[10];
p= new Poligono();
r = new Rectangulo();
c = new Circulo();.
t = new Triangulo();
conjFig[0]=p;
conjFig[0]=r;
conjFig[0]=c;
conjFig[0]=t;
conjFig
1
2
3
4
Estructuras polimorfas y código
genérico
public void dibujarFiguras()
{
for (int i=0;i<conjFig.length;i++)
conjFig[i].dibujar();
}
Ejemplo colecciones
Ejemplo HashMap
Ejemplo Código genérico
java.util.Comparator
int compare(Object o1, Object o2)
Compares its two arguments for order. Returns a
negative integer, zero, or a positive integer as the first
argument is less than, equal to, or greater than the second.
boolean equals(Object obj)
Indicates whether some other object is "equal to" this
Comparator.
java.util.Collections
static void sort (List list, Comparator c)
Sorts the specified list according to the order induced
by the specified comparator.
Ejemplo