Interfaces
Amparo Lopez Gaona
Septiembre de 2008
Amparo Lopez Gaona () Interfaces Septiembre de 2008 1 / 1
Interfaces
Las interfaces Java permiten al disenador de clases establecer suforma definiendo el comportamiento que debe tener pero sinespecificar la implementarlo.
Se trata de declarar metodos abstractos y constantes queposteriormente puedan ser implementados de diferentes maneras.
Para crear una interfaz, se utiliza la palabra reservada interface enlugar de class.
Para indicar que una clase implementa los metodos de una interfaz seutiliza la palabra clave implements.
Amparo Lopez Gaona () Interfaces Septiembre de 2008 2 / 1
Declaracion y uso
Ejemplo:
interface InstrumentoMusical {void tocar();void afinar();String tipoInstrumento();
}
Y una clase que implementa la interfaz:
class InstrumentoViento implements InstrumentoMusical {void tocar() { . . . };void afinar() { . . .};String tipoInstrumento() {}
}
class FlautaDulce extends InstrumentoViento {String tipoInstrumento() {return "Flauta Dulce";
}} Amparo Lopez Gaona () Interfaces Septiembre de 2008 4 / 1
Referencias a Interfaces
Es posible crear referencias a interfaces. Esta referencia puede ser asignadaa objetos de la clase que implementa la interfaz.No se pueden tener objetos de interfaces.
InstrumentoMusical instrumento = new FlautaDulce();instrumento.afinar();System.out.prinln(instrumento.tipoInstrumento());
InstrumentoMusical instM = new InstrumentoMusical(); //error.
Amparo Lopez Gaona () Interfaces Septiembre de 2008 6 / 1
Agrupaciones de constantes
Como todos los datos miembros que se definen en una interfaz sonconstantes, y las interfaces no pueden instanciarse resultan una buenaherramienta para implementar grupos de constantes. Por ejemplo:
public interface Meses {int ENERO = 1 , FEBRERO = 2 . . . ;String [] NOMBRES_MESES = { " " , "Enero" , "Febrero" , . . . };
}
Esto puede usarse simplemente:System.out.println(Meses.NOMBRES MESES[ENERO]);
Amparo Lopez Gaona () Interfaces Septiembre de 2008 8 / 1
Diferencias entre interfaces y clases abstractas
En una interfaz no se implementa ningun metodo (aunque no seprecedan de la palabra abstract). En una clase abstracta puedehaber implementaciones.En una interfaz no pueden existir elementos privados. En una claseabstracta puede haber privados, protegidos y publicos.Una interfaz no es parte de la jerarquıa de clases. Clases sin relacionpueden implementarse en la misma interfaz.Una interfaz no tiene constructores. Una clase abstracta puede tenerconstructores.Una interfaz no puede extender clases. Una clase abstracta puedeextender otra clase.Al implementar una interfaz se deben implementar todos los metodosdefinidos en ella. Al extender una clase abstracta es posible posponerla implementacion de metodos.Una clase puede implementar varias interfaces pero solo puede teneruna superclase.
Amparo Lopez Gaona () Interfaces Septiembre de 2008 9 / 1
Elemento mayor de un arreglo
public class EnteroMayor {private int [] arreglo;
EnteroMayor(int [] nums) {arreglo = nums;
}
public int mayor() {int max = arreglo[0];
for (int i = 1; i < arreglo.length; i++)if (max < arreglo[i])max = arreglo[i];
return max;}
}
Amparo Lopez Gaona () Interfaces Septiembre de 2008 11 / 1
Elemento mayor de un arreglo
public class EnteroMayor {private int [] arreglo;
EnteroMayor(int [] nums) {arreglo = nums;
}
public int mayor() {int max = arreglo[0];
for (int i = 1; i < arreglo.length; i++)if (max < arreglo[i])max = arreglo[i];
return max;}
}
Amparo Lopez Gaona () Interfaces Septiembre de 2008 11 / 1
... Elemento mayor de un arreglo
1 Quiero que esta clase sea generica, ¿como hago?
public class EnteroMayor {private Object [] arreglo;
EnteroMayor(Object [] nums) {arreglo = nums;
}
public int mayor() {Object max = arreglo[0];
for (int i = 1; i < arreglo.length; i++)if (max < arreglo[i])max = arreglo[i];
return max;}
}
Amparo Lopez Gaona () Interfaces Septiembre de 2008 13 / 1
... Elemento mayor de un arreglo
1 Quiero que esta clase sea generica, ¿como hago?
public class EnteroMayor {private Object [] arreglo;
EnteroMayor(Object [] nums) {arreglo = nums;
}
public int mayor() {Object max = arreglo[0];
for (int i = 1; i < arreglo.length; i++)if (max < arreglo[i])max = arreglo[i];
return max;}
}
Amparo Lopez Gaona () Interfaces Septiembre de 2008 13 / 1
... Elemento mayor de un arreglo
1 ¿Como comparo?
En el paquete java.util existe la interfazComparator, definida como sigue:
public interface Comparator {public int compare(Object o1, Object o2);public boolean equals(Object obj);
}
Amparo Lopez Gaona () Interfaces Septiembre de 2008 15 / 1
... Elemento mayor de un arreglo
1 ¿Como comparo? En el paquete java.util existe la interfazComparator, definida como sigue:
public interface Comparator {public int compare(Object o1, Object o2);public boolean equals(Object obj);
}
Amparo Lopez Gaona () Interfaces Septiembre de 2008 15 / 1
... Elemento mayor de un arreglo
import java.util.Comparator;public class ObjetoMayor {private Object [] arreglo;private final Comparator prueba;
ObjetoMayor(Object [] o, Comparator c) {arreglo = o;prueba = c;
}public Object mayor() {Object max = arreglo[0];
for (int i = 1; i < arreglo.length; i++)if (prueba.compare(max,arreglo[i]) < 0)max = arreglo[i];
return max;}
}Amparo Lopez Gaona () Interfaces Septiembre de 2008 17 / 1
Implementacion del comparador (Envolturas)
En lugar de un objeto de una clase puede ir uno de cualquiera de sussubclases.
Los tipos primitivos no son clases, por tanto no son subclases deObject, ası que no se pueden utilizar en la clase anterior.
Java tiene, en el paquete java.lang, clases para trabajar con datosprimitivos como objetos. (Envolturas)Boolean, Byte, Double, Float, Integer, Long, Short yCharacter.Estas clases tienen dos tipos de metodos.
Constructores con un parametro que corresponde a su tipo primitivo.
Integer miEntero;int i = 242;miEntero = new Integer(i);
Metodos que regresan el valor almacenado dentro de la envoltura. Sunombre es el del tipo primitivo seguido de la palabra Value y no tienenparametros. i = miEntero.intValue();
Amparo Lopez Gaona () Interfaces Septiembre de 2008 19 / 1
... Implementacion del comparador para enteros
public class ComparaEnteros implements java.util.Comparator {public int compare(Object o1, Object o2) {return ((Integer)o1).intValue() - ((Integer)o2).intValue();
}}
public class Prueba {public static void main(String [] pps) {Integer [] a = {new Integer(12), new Integer(45), new Integer(67),
new Integer(-2), new Integer(-8), new Integer(323),new Integer(125), new Integer(78), new Integer(987),new Integer(670)};
ObjetoMayor objMayor = new ObjetoMayor(a, new ComparaEnteros());System.out.println("El mayor es "+ (Integer)objMayor.mayor());
}}
Amparo Lopez Gaona () Interfaces Septiembre de 2008 21 / 1
... Implementacion del comparador para otros objetos
public class ComparaAlumnos implements java.util.Comparator {public int compare(Object o1, Object o2) {if (o1 == o2) return 0;if(o1 == null) return -1;if(o2 == null) return 1;return (int) ((Alumno)o1).promedio() - ((Alumno)o2).promedio();
}}
ObjetoMayor objMayor = new ObjetoMayor(a, new ComparaAlumnos());
public class ComparaAlumnos implements java.util.Comparator {public int compare(Object o1, Object o2) {... // Primeras 3 lineas como antesEstudiante e1 = (Alumno) o1, e2 = (Alumno) o2;int difPromedio = (int) (e2.promedio()-e1.promedio());if (difPromedio == 0)return e2.obtenNombre().compareTo(e1.obtenNombre()) * (-1);
elsereturn difPromedio; } }
Amparo Lopez Gaona () Interfaces Septiembre de 2008 23 / 1
Interfaces y TAD
public interface Conjuntable {public void agregarElemento(Object elem);public void eliminarElemento(Object elem);public boolean contieneElemento (Object elem);public boolean estaVacio();public int tamanio();public Conjuntable union(Conjuntable s1, Conjuntable s2);public Conjuntable interseccion(Conjuntable s1, Conjuntable s2);public Conjuntable diferencia(Conjuntable s1, Conjuntable s2);public boolean subconjunto(Conjuntable s1);
}
Amparo Lopez Gaona () Interfaces Septiembre de 2008 25 / 1
... Interfaces y TAD
public class Conjunto implements Conjuntable {
private Object[] datos;
public Conjunto() { this(20); }
public Conjunto(int tam) {
datos = new Object[tam <= 0 ? 20 : tam];
for (int i = 0; i < datos.length; i++)
datos[i] = null;
}
public boolean estaVacio(){
for (int i = 0; i < datos.length; i++)
if (datos[i] != null) return false;
return true;
}
public int tamanio(){
int tam = 0;
for (int i = 0; i < datos.length; i++)
if (datos[i] != null) tam++;
return tam;
}
public boolean contieneElemento (Object elem){
if (!estaVacio())
for (int i = 0; i < datos.length; i++)
if (elem.equals(datos[i]))
return true;
return false;
}
Amparo Lopez Gaona () Interfaces Septiembre de 2008 27 / 1
... Interfaces y TAD
public void eliminarElemento(Object elem) {
for (int i = 0; i < datos.length; i++)
if (elem.equals(datos[i])) {
datos[i] = null;
return;
}
throw new ExcepcionDeConjunto("El elemento "+elem+
" no se puede eliminar pues no est\’a en el conjunto");
}
public void agregarElemento(Object elem){
if (! contieneElemento(elem)) {
for (int i=0; i < datos.length; i++)
if (datos[i] == null) {
datos[i] = elem;
return;
}
throw new ExcepcionDeConjunto("El conjunto est’a lleno.");
}
throw new ExcepcionDeConjunto("El elemento "+elem+" ya est’a en el conjunto");
}
... // Otros m’etodos
Amparo Lopez Gaona () Interfaces Septiembre de 2008 29 / 1
Iteradores
class PruebaConjuntos {public static void main(String [] pps) {Conjunto grupo = new Conjunto();
... // Instrucciones para llenar el conjunto
?‘C’omo imprimo todos los elementos del conjunto?}
}
Amparo Lopez Gaona () Interfaces Septiembre de 2008 31 / 1
Iteradores
public interface Iterator {public boolean hasNext();public Object next();public void remove();
}
Los metodos de la interfaz Iterador tienen el siguiente proposito:
hasNext devuelve un valor booleano indicando si hay un siguienteelemento (true) y apunta a tal elemento. En caso de no haber maselementos devuelve false.
next devuelve el siguiente elemento. Al no haber elemento dispara laexcepcion NoSuchElementException.
remove permite eliminar un elemento de la coleccion.
Amparo Lopez Gaona () Interfaces Septiembre de 2008 33 / 1
... Iteradores
import java.util.*;
public class Conjunto implements Conjuntable {
... // Misma estructura y m’etodos que antes
public Iterator elementos () {
return new miIterador();
}
private class miIterador implements Iterator {
private int pos;
public miIterador(){
pos = 0;
}
public boolean hasNext() {
while (pos < datos.length && datos[pos] == null)
pos++;
return (pos < datos.length);
}
public Object next() throws NoSuchElementException {
if (hasNext())
return datos[pos++];
throw new NoSuchElementException("No hay elementos en el conjunto");
}
public void remove() throws IllegalStateException,
NoSuchElementException {}
}
}
Amparo Lopez Gaona () Interfaces Septiembre de 2008 35 / 1
... Iteradores
public static void main( String[] pps) {...
System.out.println("Voy a imprimir: ");for (Iterator it = c.elementos(); it.hasNext();)
System.out.print((Integer) it.next() + " ");}
Union de conjuntos
public void union(Conjunto c) {Iterator it = c.elementos();while(it.hasNext()) {agregarElemento(it.next());
}}
Amparo Lopez Gaona () Interfaces Septiembre de 2008 37 / 1
... Iteradores
public static void main( String[] pps) {...
System.out.println("Voy a imprimir: ");for (Iterator it = c.elementos(); it.hasNext();)
System.out.print((Integer) it.next() + " ");}
Union de conjuntos
public void union(Conjunto c) {Iterator it = c.elementos();while(it.hasNext()) {agregarElemento(it.next());
}}
Amparo Lopez Gaona () Interfaces Septiembre de 2008 37 / 1
... Iteradores
public static void main( String[] pps) {...
System.out.println("Voy a imprimir: ");for (Iterator it = c.elementos(); it.hasNext();)
System.out.print((Integer) it.next() + " ");}
Union de conjuntos
public void union(Conjunto c) {Iterator it = c.elementos();while(it.hasNext()) {agregarElemento(it.next());
}}
Amparo Lopez Gaona () Interfaces Septiembre de 2008 37 / 1
Interfaces y polimorfismo
En Java solo existe la herencia simple, pero las clases pueden implementarinterfaces.
public abstract class Animal {public abstract void hablar();
}class Perro extends Animal{
public void hablar(){ System.out.println("!‘Guau!"); }}class Gato extends Animal{
public void hablar(){ System.out.println("!‘Miau!"); }}public class AnimalesParlantes {public static void main(String[] pps) {Gato gato=new Gato();hazleHablar(gato);
}
static void hazleHablar(Animal sujeto){ sujeto.hablar(); }} Amparo Lopez Gaona () Interfaces Septiembre de 2008 39 / 1
... Interfaces y polimorfismo
public interface Parlanchin {public abstract void hablar();
}
public abstract class Animal implements Parlanchin{public abstract void hablar();
}
class Perro extends Animal{public void hablar(){
System.out.println("!‘Guau!");}
}
class Gato extends Animal{public void hablar(){
System.out.println("!‘Miau!");}
} Amparo Lopez Gaona () Interfaces Septiembre de 2008 41 / 1
... Interfaces y polimorfismo
public abstract class Reloj { ...}class Cucu extends Reloj implements Parlanchin{
public void hablar(){System.out.println("!‘Cucu, cucu, ..!");
}}
public class Polimorfismo {public static void main(String[] args) {Gato gato=new Gato();hazleHablar(gato);Cucu cucu=new Cucu();hazleHablar(cucu);
}
static void hazleHablar(Parlanchin sujeto){sujeto.hablar();
}}
Amparo Lopez Gaona () Interfaces Septiembre de 2008 43 / 1