Documentos de Académico
Documentos de Profesional
Documentos de Cultura
Interfaces
Interfaces
JA
Bauman / Dcima
Java Electrotecnia
Interfaces
Java
2 POLITECNICO
Las interfaces son implementadas y usadas por medio de la biblioteca de clases de Java cada vez que
se espera que un comportamiento sea implementado por varias clases dispares. Por ejemplo, en la
jerarqua de clases de Java estn las interfaces java.lang.Runnable, java.util.Enumeration,
java.util.Observable, java.awt.image.ImageConsumer y
java.awt.image.ImageProducer. Las interfaces en la jerarqua de clases estndar de Java pueden
serle tiles en sus propios programas, por lo que asegrese de examinar la API para ver lo que se
encuentra disponible.
POLITECNICO 3
Interfaces
Java
Interfaces y clases
Las interfaces y clases, a pesar de sus definiciones diferentes, tienen mucho en comn. Las interfaces,
al igual que las clases, se declaran en archivos fuente con una interfaz en un archivo. Al igual que las
clases, tambin se compilan usando el compilador Java hacia archivos .class. Y en la mayora de los
casos, en cualquier lugar que se puede usar una clase (como tipo de dato para una variable, como el
resultado de un casting, etctera) tambin se puede usar una interfaz.
Casi en cualquier lugar en donde hay un nombre de clase, en cualquiera de los ejemplos o anlisis de
este libro, se puede sustituir por un nombre de interfaz. Los programadores Java a menudo dicen clase
cuando quieren decir clase o interfaz. Las interfaces complementan y extienden el poder de las clases, y
ambas pueden ser tratadas casi exactamente igual. Una de las pocas diferencias entre ellas es que una
interfaz no puede ser instanciada: new slo puede crear una instancia de una clase.
Para usar una interfaz se incluye la palabra clave implements como parte de la definicin de clase.
Por ejemplo, para usar una interfaz llamada miInterfaz con una clase llamada miApplet se podra
usar la siguiente definicin:
Debido a que las interfaces solamente proporcionan definiciones de mtodos abstractos, usted tiene
que implementar esos mtodos en sus propias clases usando las mismas firmas de mtodo de la interfaz.
Observe que una vez que incluye una interfaz tiene que implementar todos los mtodos de esa interfaz, no
puede tomar y escoger los mtodos que necesite. Mediante la implementacin de una interfaz les indica a
los usuarios de su clase que se soportara todo lo de esa interfaz. (Observe que esta es otra diferencia
entre las interfaces y las clases abstractas; las subclases de estas ultimas pueden escoger que mtodos
implementar o sobreponer, y pueden ignorar a los dems.)
Una vez que su clase implementa una interfaz, las subclases de su clase heredaran estos nuevos
mtodos (y podrn sobreponerlos o sobrecargarlos) al igual que si su superclase los hubiera definido. Si su
clase hereda de una superclase que implementa una interfaz dada, no tiene que incluir la palabra clave
implements en su propia definicin de clase.
Examinemos ahora un ejemplo simple, la creacin de la nueva clase GoldenRetriever. Suponga que
ya tiene una buena implementacin de la ciase Animal y una interfaz, ComoAnimal, que representa lo que se espera
que sean capaces de hacer los animales. Usted necesita que GoldenRetriever sea un animal, pero que tambin
tenga caractersticas de perro, tal como la habilidad de rodar sobre l. A continuacin se presenta la manera de
4 POLITECNICO
expresar todo esto (no se preocupe por ahora acerca de la definicin de estas interfaces, ya que posteriormente
aprender ms sobre esto):
interface ComoAnimal {
void comer();
void dormir();
...
}
interface ComoPerro {
void rodar();
void arruinarCespedDelVecino();
}
Observe que la clase GoldenRetriever no tiene que decir implements ComoAnimal, debido a
que mediante la extensin de Animal, ya lo tiene! Una de las cosas agradables acerca de esta estructura
es que se puede cambiar de opinin acerca de lo que la clase GoldenRetriever extiende (por ejemplo,
si se implementa de improviso una clase Perro muy buena), y aun as la clase GoldenRetriever
comprender las mismas dos interfaces.
POLITECNICO 5
Interfaces
Java
Observe que pueden resultar complicaciones con la implementacin de varias interfaces, ya que, que
pasa si dos interfaces diferentes detienen el mismo mtodo? Hay tres combinaciones que pueden resolver
esto:
? Si los dos mtodos en cada una de las interfaces tienen firmas idnticas, usted implementa un
mtodo en su clase y esa definicin satisface a ambas interfaces.
? Si los dos mtodos tienen diferentes listas de parmetros, este es un caso simple de sobrecarga de
mtodo; tiene que implementar ambas firmas de mtodo y cada definicin satisface su definicin de
interfaz respectivo.
? Si los dos mtodos tienen la misma lista de parmetros, pero difieren en tipo de retorno, no puede
crear un mtodo que satisfaga a ambos (recuerde que la sobrecarga de mtodos es activada por la
lista de parmetros y no por el tipo de retorno). En este caso, el tratar de compilar una clase que
implemente ambas interfaces producir un error de compilacin. Este problema hace pensar que sus
interfaces tienen algunas fallas de diseo que necesitan ser reexaminadas.
Cuando se declare que una variable sea de un tipo de interfaz, simplemente significa que cualquier
objeto al que se refiera la variable se espera que tenga implementada esa interfaz, esto es, se espera que
comprenda todos los mtodos que esa interfaz especifica. Se supone que se mantiene una promesa hecha
entre el diseador de la interfaz y sus implementadores eventuales. En este caso, debido a que
ARunnableObject contiene un objeto de tipo Runnable, la suposicin es de que se puede llamar a
aRunnableObject.run().
Lo importante en esta situacin es que aunque se espera que aRunnableObject sea capaz de tener
un mtodo run(), usted podra escribir este cdigo mucho antes de que sea implementada (o hasta
creada!) cualquier clase que califique. En la programacin orientada a objetos tradicional, para obtener el
mismo efecto se esta forzado a crear una clase con implementaciones de manejador (stub).
Tambin puede convertir objetos mediante casting hacia una interfaz, al igual que como puede
convertir objetos hacia otras clases. Por ejemplo, regresemos a la definicin de la clase
GoldenRetriever, que implement las interfaces ComoAnimal (por medio de su superclase Animal) y
ComoPerro.
Aqu convertir, mediante casting, instancias de GoldenRetriever hacia clases e interfaces:
6 POLITECNICO
GoldenRetriever unGoldenRetriever = new GoldenRetriever();
Animal anAnimal = (Animal) unGoldenRetriever;
ComoAnimal unComoAnimal = (ComoAnimal)unGoldenRetriever;
ComoPerro unComoPerro = (ComoPerro) unGoldenRetriever;
Las declaraciones y castings estn usadas en este ejemplo para restringir el comportamiento de un
GoldenRetriever actuar como un simple animal o perro, pero no ambos. Esto es mostrado por los objetos
unAnimal, unComoAnimal y unComoPerro.
Por ultimo, observe que aunque las interfaces se usan generalmente para mezclar comportamientos de otras
clases (firmas de mtodo), las interfaces tambin pueden usarse para mezclar Constantes generalmente tiles. Por
ejemplo, si una interfaz define un conjunto de constantes, y luego varias clases usan esas constantes, los valores de
esas constantes podran ser cambiados globalmente sin tener que modificar varias clases. Este es otro ejemplo
en donde el uso de interfaces para separar el diseo de la implementacin puede hacer que el cdigo sea
ms general y ms fcilmente mantenible.
Creacin de interfaces
Despus de usar interfaces durante un tiempo, el siguiente paso es definir sus propias interfaces. Las
interfaces se parecen mucho a las clases, ya que son declaradas en forma muy similar y pueden ser
acomodadas en una jerarqua. Sin embargo, hay reglas que se deben seguir para la declaracin de
interfaces.
Interfaces nuevas
Para crear una interfaz nueva tiene que declararla de la manera siguiente:
Esto es, efectivamente, igual a una declaracin de clase, con la palabra interface reemplazando a la
palabra class. Dentro de la definicin de interfaz se tienen mtodos y constantes. Las definiciones de
mtodos dentro de la interfaz son mtodos public y abstract, y se les puede declarar en forma
explcita como tales o sern cambiados a mtodos public abstract en caso de que no se incluyan
estos modificadores. No se puede declarar un mtodo dentro de una interfaz para que sea private o
protected.
POLITECNICO 7
Interfaces
Java
Observe que, al igual que como sucede con los mtodos abstract en las clases, los mtodos que
estn dentro de las interfaces no tienen cuerpo. Recuerde que una interfaz es diseo puro y no hay
implementacin involucrada.
Adems de los mtodos, las interfaces tambin pueden tener variables, pero estas variables deben ser
declaradas public, static y final (haciendo que sean constantes). Al igual que con los mtodos,
puede definir explcitamente una variable para que sea public, static y final, o ser definida
implcitamente como tal en caso de que no utilice los siguientes modificadores:
Las interfaces deben tener proteccin pblica y de paquete, al igual que las clases. Sin embargo,
observe que las interfaces que no tienen modificador public no convierten automticamente sus
mtodos a public y abstract o sus constantes a public. Una interfaz que no es public tambin
tiene mtodos y constantes no public que slo pueden ser usados por las clases y otras interfaces del
mismo paquete.
Las interfaces, al igual que las clases, pueden pertenecer a un paquete mediante la adicin de una
definicin de paquete a la primera lnea. Las interfaces tambin pueden importar otras interfaces y clases
de otros paquetes, al igual que las clases.
8 POLITECNICO
public interface ComoAnimal {
public abstract reproducir(ComoAnimal otroAnimal) {
...
}
}
Luego, en una implementacin para este mtodo en una clase, se puede tomar el argumento genrico
ComoAnimal y convertirlo mediante casting hacia el objeto adecuado:
Extensin de interfaces
Al igual que como sucede con las clases, las interfaces pueden ser organizadas en una jerarqua.
Cuando una interfaz hereda de otra interfaz, esa "subinterfaz" adquiere todas las definiciones de
mtodo y constantes que defini su <superinterfaz>. Para extender una interfaz utilice la palabra clave
extends, al igual que en una definicin de clase:
Observe que, a diferencia de las clases, la jerarqua de interfaces no tiene equivalente de la clase
0bject, ya que la jerarqua de interfaces no esta enraizada en ningn punto. Las interfaces pueden existir
completamente por su cuenta o heredar de otra interfaz.
Observe tambin que, a diferencia de la jerarqua de clases, la jerarqua de interfaces tiene herencia
mltiple. Por ejemplo, una sola interfaz puede extender tantas clases como necesite hacerlo (separadas
por comas en la parte extends de la definicin), y la nueva interfaz contendr una combinacin de todos
los mtodos y constantes de sus madres.
En las interfaces con herencia mltiple, las reglas para el manejo de conflictos de nombre de mtodo
son las mismas que para las clases que usan varias interfaces, y los mtodos que difieren solamente en el
tipo de retorno darn como resultado un error de compilacin.
POLITECNICO 9