Una interfaz en el lenguaje de programación Java es un tipo abstracto que se usa para especificar un comportamiento que las clases deben implementar. Son similares a los protocolos . Las interfaces se declaran utilizando la interface
palabra clave y solo pueden contener firmas de métodos y declaraciones constantes (declaraciones de variables que se declaran como ambas static
y final
). Todos los métodos de una interfaz no contienen aplicación (código de método) como de todas las versiones de Java debajo de 8. A partir de Java 8, default
y static
los métodos pueden tener aplicación en la interface
definición. [1] Luego, en Java 9 private
yprivate static
Se agregaron métodos. En la actualidad, una interfaz Java puede tener hasta seis tipos diferentes.
Las interfaces no se pueden instanciar , sino que se implementan. Una clase que implementa una interfaz debe implementar todos los métodos no predeterminados descritos en la interfaz o ser una clase abstracta . Las referencias a objetos en Java se pueden especificar para que sean de un tipo de interfaz; en cada caso, deben ser nulos o estar vinculados a un objeto que implemente la interfaz.
Un beneficio de usar interfaces es que simulan herencia múltiple . Todas las clases en Java deben tener exactamente una clase base , siendo la única excepción java.lang.Object
(la clase raíz del sistema de tipos Java ); no se permite la herencia múltiple de clases. Sin embargo, una interfaz puede heredar múltiples interfaces y una clase puede implementar múltiples interfaces.
Descripción general
Las interfaces se utilizan para codificar similitudes que comparten las clases de varios tipos, pero no necesariamente constituyen una relación de clase. Por ejemplo, un humano y un loro pueden silbar ambos ; sin embargo, no tendría sentido representar Human
sy Parrot
s como subclases de una Whistler
clase. Más bien, lo más probable es que sean subclases de una Animal
clase (probablemente con clases intermedias), pero ambas implementarán la Whistler
interfaz.
Otro uso de las interfaces es poder utilizar un objeto sin conocer su tipo de clase, sino solo que implementa una determinada interfaz. Por ejemplo, si a uno le molesta un silbido, es posible que no sepa si es un humano o un loro, porque todo lo que podría determinarse es que un silbido está silbando. La llamada whistler.whistle()
llamará al método whistle
de objeto implementado whistler
sin importar qué clase tenga, siempre que implemente Whistler
. En un ejemplo más práctico, un algoritmo de clasificación puede esperar un objeto de tipo Comparable
. Por lo tanto, sin conocer el tipo específico, sabe que los objetos de ese tipo se pueden clasificar de alguna manera.
Por ejemplo:
interfaz Bounceable { doble pi = 3.1415 ; void setBounce (); // Tenga en cuenta que el punto y coma // Los métodos de interfaz son públicos, abstractos y nunca definitivos. // Piense en ellos solo como prototipos; no se permiten implementaciones. }
Una interfaz:
- declara solo encabezados de método y constantes públicas.
- no se puede crear una instancia.
- puede ser implementado por una clase.
- no se puede extender una clase.
- puede ampliar varias otras interfaces.
Uso
Definiendo una interfaz
Las interfaces se definen con la siguiente sintaxis (compárese con la definición de clase de Java ):
[ visibilidad ] interfaz InterfaceName [extiende otras interfaces ] { declaraciones constantes declaraciones de métodos abstractos}
Ejemplo: interfaz pública Interface1 extiende Interface2;
El cuerpo de la interfaz contiene métodos abstractos , pero como todos los métodos de una interfaz son, por definición, abstractos, la abstract
palabra clave no es necesaria. Dado que la interfaz especifica un conjunto de comportamientos expuestos, todos los métodos son implícitamente public
.
Por lo tanto, una interfaz simple puede ser
Depredador de interfaz pública { boolean chasePrey ( Prey p ); void eatPrey ( Prey p ); }
Las declaraciones de tipo de miembro en una interfaz son implícitamente estáticas, finales y públicas, pero de lo contrario pueden ser cualquier tipo de clase o interfaz. [2]
Implementando interfaces en una clase
La sintaxis para implementar una interfaz usa esta fórmula:
... implementa InterfaceName [, otra interfaz , otra , ...] ...
Las clases pueden implementar una interfaz. Por ejemplo:
Lion de clase pública implementa Predator { @Override public boolean chasePrey ( Prey p ) { // Programación para perseguir a la presa p (específicamente para un león) } @Override public void eatPrey ( Prey p ) { // Programación para comer presa p (específicamente para un león) } }
Si una clase implementa una interfaz y no implementa todos sus métodos, debe marcarse como abstract
. Si una clase es abstracta, se espera que una de sus subclases implemente sus métodos no implementados, aunque si alguna de las subclases de la clase abstracta no implementa todos los métodos de interfaz, la subclase en sí debe marcarse nuevamente como abstract
.
Las clases pueden implementar múltiples interfaces:
Frog de clase pública implementa Predator , Prey { ... }
Las interfaces pueden compartir métodos de clase comunes:
clase Animal implementa LikesFood , LikesWater { boolean likes () { return true ; } }
Sin embargo, una clase determinada no puede implementar la misma interfaz o una similar varias veces:
class Animal implementa Shares < Boolean > , Shares < Integer > ... // Error: interfaz repetida
Las interfaces se utilizan comúnmente en el lenguaje Java para devoluciones de llamada , [3] ya que Java no permite la herencia múltiple de clases, ni permite el paso de métodos (procedimientos) como argumentos. Por lo tanto, para pasar un método como parámetro a un método de destino, la práctica actual es definir y pasar una referencia a una interfaz como un medio para proporcionar la firma y la dirección del método de parámetro al método de destino en lugar de definir múltiples variantes. del método de destino para acomodar cada clase de llamada posible.
Subinterfaces
Las interfaces pueden ampliar varias otras interfaces, utilizando la misma fórmula que se describe a continuación. Por ejemplo,
interfaz pública VenomousPredator extiende Predator , Venomous { // Interface body }
es legal y define una subinterfaz. Permite la herencia múltiple, a diferencia de las clases. Predator
y Venomous
posiblemente defina o herede métodos con la misma firma, digamos kill(Prey p)
. Cuando una clase se implementa VenomousPredator
, implementará ambos métodos simultáneamente.
Ejemplos de
Algunas interfaces comunes de Java son:
Comparable
tiene el métodocompareTo
, que se utiliza para describir dos objetos como iguales o para indicar que uno es mayor que el otro. Los genéricos permiten implementar clases para especificar qué instancias de clase se pueden comparar con ellas.Serializable
es una interfaz de marcador sin métodos ni campos; tiene un cuerpo vacío. Se utiliza para indicar que una clase se puede serializar . Su Javadoc describe cómo debería funcionar, aunque nada se aplica mediante programación
Ver también
Referencias
- ^ "Métodos predeterminados" . Archivado desde el original el 23 de mayo de 2017 . Consultado el 30 de junio de 2014 .
- ^ "La especificación del lenguaje Java" .
- ^ Mitchell, John D. (1 de junio de 1996). "Consejo 10 de Java: implementar rutinas de devolución de llamada en Java" . JavaWorld . Consultado el 14 de julio de 2020 .