Articulo de referencia

Interfaz (Java)

Una interfaz en el lenguaje de programación Java es un tipo abstracto que se utiliza para declarar un comportamiento que las clases deben implementar. Son similares a los protoc...

Una interfaz en el lenguaje de programación Java es un tipo abstracto que se utiliza para declarar un comportamiento que las clases deben implementar. Son similares a los protocolos . Las interfaces se declaran utilizando la interfacepalabra clave y solo pueden contener firmas de métodos y declaraciones de constantes (declaraciones de variables que se declaran como staticy final). Todos los métodos de una interfaz no contienen implementación (cuerpos de métodos) en todas las versiones anteriores a Java 8. A partir de Java 8, default[ 1 ] : 99 y static[ 1 ] : 7 los métodos pueden tener implementación en la interfacedefinición. [ 2 ] Luego, en Java 9, se agregaron los métodos privatey private static. Actualmente, una interfaz Java puede tener hasta seis tipos diferentes. Tales interfaces existen en C# .

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 . En Java, las referencias a objetos pueden especificarse como de un tipo de interfaz; en ambos casos, deben ser nulas o estar vinculadas a un objeto que implemente la interfaz.

Una ventaja de usar interfaces es que simulan la herencia múltiple . Todas las clases en Java deben tener exactamente una clase base , con la única excepción de java.lang.Objectla clase raíz del sistema de tipos de Java ; la herencia múltiple de clases no está permitida. Sin embargo, una interfaz puede heredar de múltiples interfaces y una clase puede implementar múltiples interfaces.

Descripción general

Las interfaces se utilizan para codificar similitudes entre clases de distintos tipos, pero no necesariamente constituyen una relación de clases. Por ejemplo, un humano y un loro pueden silbar ; sin embargo, no tendría sentido representarlos Humancomo Parrotsubclases de una Whistlerclase. Lo más probable es que sean subclases de una Animalclase (posiblemente con clases intermedias), pero ambas implementarían la Whistlerinterfaz.

Otro uso de las interfaces es poder usar un objeto sin conocer su tipo de clase, sino solo que implementa una interfaz determinada. Por ejemplo, si a alguien le molesta un silbido, puede que no sepa si es un humano o un loro, porque lo único que se puede determinar es que alguien está silbando. La llamada whistler.whistle()invocará el método implementado whistledel objeto whistlersin importar qué clase tenga, siempre que implemente Whistler. En un ejemplo más práctico, un algoritmo de ordenació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 ordenar de alguna manera.

Por ejemplo:

interfaz Rebotable { doble pi = 3.1415 ;// Nótese el punto y coma // Los métodos de interfaz son públicos, abstractos y nunca finales. // Normalmente se consideran prototipos, pero se permiten implementaciones predeterminadas void setBounce (); }

Una interfaz:

  • Declara únicamente los encabezados de los métodos y las constantes públicas.
  • no se puede instanciar.
  • puede ser implementado por una clase. [ 1 ] : 75
  • no puede extender una clase.
  • puede extender varias otras interfaces. [ 1 ] : 87

Uso

Definir 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 de constantes declaraciones de métodos abstractos declaraciones de métodos estáticos }

Ejemplo:

interfaz pública Interface1 extiende Interface2 , Interface3 , Interface4 ;

El cuerpo de la interfaz contiene métodos abstractos , pero dado que todos los métodos en una interfaz son, por definición, abstractos, la abstractpalabra 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, se puede crear una interfaz sencilla.

interfaz pública Depredador { booleano perseguirPresa ( Prey p ); void comerPresa ( Prey p ); }

Las declaraciones de tipo de miembro en una interfaz son implícitamente estáticas, finales y públicas, pero por lo demás pueden ser de cualquier tipo de clase o interfaz. [ 3 ]

Implementación de interfaces en una clase

La sintaxis para implementar una interfaz utiliza esta fórmula:

... implementa InterfaceName [, otra interfaz , otra , ...] ...

Las clases pueden implementar una interfaz. Por ejemplo:

public class Lion extends Animal implements 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 la 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 la interfaz, la propia subclase debe marcarse de nuevo como abstract.

Las clases pueden implementar múltiples interfaces:

public class Frog extends Animal implements Predator , Prey { // ... }

Las interfaces pueden compartir métodos de clase comunes:

clase abstracta Animal implementa LikesFood , LikesWater { boolean likes () { return true ; } }

Sin embargo, una clase determinada no puede implementar la misma interfaz o una similar varias veces:

// Error: interfaz repetida clase abstracta Animal implementa Shares < Boolean > , Shares < Integer > ... { // ... }

Las interfaces se utilizan comúnmente en el lenguaje Java para las funciones de devolución de llamada , [ 4 ] ya que Java no permite la herencia múltiple de clases ni 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 consiste en definir y pasar una referencia a una interfaz 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 cada clase que lo llame.

Subinterfaces

Las interfaces pueden extender varias otras interfaces, utilizando la misma fórmula que se describe a continuación. Por ejemplo,

public interface VenomousPredator extends Predator , Venomous { // Cuerpo de la interfaz }

es legal y define una subinterfaz. Permite la herencia múltiple, a diferencia de las clases. Predatory Venomousposiblemente puede definir o heredar métodos con la misma firma, por ejemplo kill(Prey p). Cuando una clase implementa, VenomousPredatorimplementará ambos métodos simultáneamente.

Ejemplos

Algunas interfaces comunes de Java son:

  • Comparabletiene el método compareTo, que se usa para describir dos objetos como iguales, o para indicar que uno es mayor que el otro. Los genéricos permiten a las clases que implementan la clase especificar con qué instancias de la clase se pueden comparar.
  • SerializableEs una interfaz de marcador sin métodos ni campos; tiene un cuerpo vacío. Se utiliza para indicar que una clase puede serializarse . Su Javadoc describe cómo debería funcionar, aunque no se impone nada mediante programación.

Véase también

Citas

  1. 1 2 3 4 Bloch 2018 .
  2. "Métodos predeterminados" . Archivado del original el 23 de mayo de 2017. Consultado el 30 de junio de 2014 .
  3. "Especificación del lenguaje Java" .
  4. Mitchell, John D. (1 de junio de 1996). "Java Tip 10: Implementar rutinas de devolución de llamada en Java" . JavaWorld . Recuperado el 14 de julio de 2020 .

Referencias

  • Bloch, Joshua (2018). «Java eficaz: Guía del lenguaje de programación» (tercera  ed.). Addison-Wesley. ISBN 978-0134685991.
  • ¿Qué es una interfaz?