¿Qué es una interfaz en Java?

Justo como un contrapunto a esta pregunta : ¿qué es una interfaz en Java?

Una interfaz es una forma especial de una clase abstracta que no implementa ningún método. En Java, creas una interfaz como esta:

interface Interface { void interfaceMethod(); } 

Como la interfaz no puede implementar ningún método, se implica que todo, incluidos todos los métodos, son públicos y abstractos (el resumen en términos de Java significa “no implementado por esta clase”). Entonces, la interfaz anterior es idéntica a la interfaz a continuación:

 public interface Interface { abstract public void interfaceMethod(); } 

Para usar esta interfaz, simplemente necesita implementar la interfaz. Muchas clases pueden implementar una interfaz, y una clase puede implementar muchas interfaces:

 interface InterfaceA { void interfaceMethodA(); } interface InterfaceB { void interfaceMethodB(); } public class ImplementingClassA implements InterfaceA, InterfaceB { public void interfaceMethodA() { System.out.println("interfaceA, interfaceMethodA, implementation A"); } public void interfaceMethodB() { System.out.println("interfaceB, interfaceMethodB, implementation A"); } } public class ImplementingClassB implements InterfaceA, InterfaceB { public void interfaceMethodA() { System.out.println("interfaceA, interfaceMethodA, implementation B"); } public void interfaceMethodB() { System.out.println("interfaceB, interfaceMethodB, implementation B"); } } 

Ahora, si quisiera, podría escribir un método como este:

 public void testInterfaces() { ImplementingClassA u = new ImplementingClassA(); ImplementingClassB v = new ImplementingClassB(); InterfaceA w = new ImplementingClassA(); InterfaceA x = new ImplementingClassB(); InterfaceB y = new ImplementingClassA(); InterfaceB z = new ImplementingClassB(); u.interfaceMethodA(); // prints "interfaceA, interfaceMethodA, implementation A" u.interfaceMethodB(); // prints "interfaceB, interfaceMethodB, implementation A" v.interfaceMethodA(); // prints "interfaceA, interfaceMethodA, implementation B" v.interfaceMethodB(); // prints "interfaceB, interfaceMethodB, implementation B" w.interfaceMethodA(); // prints "interfaceA, interfaceMethodA, implementation A" x.interfaceMethodA(); // prints "interfaceA, interfaceMethodA, implementation B" y.interfaceMethodB(); // prints "interfaceB, interfaceMethodB, implementation A" z.interfaceMethodB(); // prints "interfaceB, interfaceMethodB, implementation B" } 

Sin embargo, nunca podrías hacer lo siguiente:

 public void testInterfaces() { InterfaceA y = new ImplementingClassA(); InterfaceB z = new ImplementingClassB(); y.interfaceMethodB(); // ERROR! z.interfaceMethodA(); // ERROR! } 

La razón por la que no puede hacer esto es que y es de tipo interfaceA , y no hay interfaceMethodB() en interfaceA . Del mismo modo, z es de tipo interfaceB y no hay interfaceMethodA() en interfaceB .

Mencioné anteriormente que las interfaces son solo una forma especial de una clase abstracta. Para ilustrar ese punto, mira el siguiente código.

 interface Interface { void abstractMethod(); } abstract public class AbstractClass { abstract public void abstractMethod(); } 

Heredarías de estas clases casi exactamente de la misma manera:

 public class InheritsFromInterface implements Interface { public void abstractMethod() { System.out.println("abstractMethod()"); } } public class InteritsFromAbstractClass extends AbstractClass { public void abstractMethod() { System.out.println("abstractMethod()"); } } 

De hecho, incluso podría cambiar la interfaz y la clase abstracta de esta manera:

 interface Interface { void abstractMethod(); } abstract public class AbstractClass implements Interface { abstract public void abstractMethod(); } public class InheritsFromInterfaceAndAbstractClass extends AbstractClass implements Interface { public void abstractMethod() { System.out.println("abstractMethod()"); } } 

Sin embargo, hay dos diferencias entre las interfaces y las clases abstractas.

La primera diferencia es que las interfaces no pueden implementar métodos.

 interface Interface { public void implementedMethod() { System.out.println("implementedMethod()"); } } 

La interfaz anterior genera un error de comstackción porque tiene una implementación para implementedMethod() . Si desea implementar el método pero no puede instanciar la clase, debería hacerlo así:

 abstract public class AbstractClass { public void implementedMethod() { System.out.println("implementedMethod()"); } } 

No se trata de una clase abstracta porque ninguno de sus miembros es abstracto, pero es legal Java.

La otra diferencia entre interfaces y clases abstractas es que una clase puede heredar de múltiples interfaces, pero solo puede heredar de una clase abstracta.

 abstract public class AbstractClassA { } abstract public class AbstractClassB { } public class InheritsFromTwoAbstractClasses extends AbstractClassA, AbstractClassB { } 

El código anterior genera un error de comstackción, no porque las clases estén todas vacías, sino porque InheritsFromTwoAbstractClasses intenta heredar de dos clases abstractas, lo que es ilegal. Lo siguiente es perfectamente legal.

 interface InterfaceA { } interface InterfaceB { } public class InheritsFromTwoInterfaces implements InterfaceA, InterfaceB { } 

La primera diferencia entre las interfaces y las clases abstractas es la razón de la segunda diferencia . Eche un vistazo al siguiente código.

 interface InterfaceA { void method(); } interface InterfaceB { void method(); } public class InheritsFromTwoInterfaces implements InterfaceA, InterfaceB { void method() { System.out.println("method()"); } } 

No hay problema con el código anterior porque InterfaceA e InterfaceB no tienen nada que ocultar. Es fácil decir que una llamada al method imprimirá “método ()”.

Ahora mira el siguiente código:

 abstract public class AbstractClassA { void method() { System.out.println("Hello"); } } abstract public class AbstractClassB { void method() { System.out.println("Goodbye"); } } public class InheritsFromTwoAbstractClasses extends AbstractClassA, AbstractClassB { } 

Esto es exactamente lo mismo que en nuestro otro ejemplo, excepto que debido a que podemos implementar métodos en clases abstractas, lo hicimos, y porque no tenemos que implementar métodos ya implementados en una clase heredada, no lo hicimos. Pero puede haber notado, hay un problema. ¿Qué sucede cuando llamamos a las new InheritsFromTwoAbstractClasses().method() ? ¿Imprime “Hola” o “Adiós”? Probablemente no lo sepas, y tampoco el comstackdor de Java. Otro lenguaje, C ++ permitió este tipo de herencia y resolvieron estos problemas de manera que a menudo eran muy complicados. Para evitar este tipo de problemas, Java decidió hacer ilegal esta “herencia múltiple”.

La desventaja de la solución de Java es que no se puede hacer lo siguiente:

 abstract public class AbstractClassA { void hi() { System.out.println("Hello"); } } abstract public class AbstractClassB { void bye() { System.out.println("Goodbye"); } } public class InheritsFromTwoAbstractClasses extends AbstractClassA, AbstractClassB { } 

AbstractClassA y AbstractClassB son “mixins” o clases que no están destinadas a ser instanciadas, sino que agregan funcionalidad a las clases en las que están “mezcladas” a través de la herencia. Obviamente no hay problema para averiguar qué sucede si llama a las new InheritsFromTwoAbstractClasses().hi() o new InheritsFromTwoAbstractClasses().bye() , pero no puede hacerlo porque Java no lo permite.

(Sé que esta es una publicación larga, así que si hay algún error, por favor avíseme y los corregiré).

Una interfaz en Java es un plano de una clase. Tiene constantes estáticas y métodos abstractos solamente. La interfaz en Java es un mecanismo para lograr una abstracción total. Solo puede haber métodos abstractos en la interfaz de Java, no en el cuerpo del método. Se usa para lograr una abstracción total y una herencia múltiple en Java. Una interfaz es una colección de métodos abstractos. Una clase implementa una interfaz, heredando así los métodos abstractos de la interfaz. Una interfaz no es una clase. Escribir una interfaz es similar a escribir una clase, pero son dos conceptos diferentes. Una clase describe los atributos y comportamientos de un objeto. Una interfaz contiene comportamientos (métodos abstractos) que implementa una clase. A menos que la clase que implementa la interfaz sea abstracta, todos los métodos de la interfaz deben definirse en la clase. Dado que la herencia múltiple no está permitida en Java, la interfaz es solo una forma de implementar la herencia múltiple. Aquí hay un ejemplo para entender la interfaz

 interface Printable{ void print(); } interface Showable{ void print(); } class testinterface1 implements Printable,Showable{ public void print(){System.out.println("Hello");} public static void main(String args[]){ testinterface1 obj = new testinterface1(); obj.print(); } } 

La interfaz es el plano de una clase.

Hay un concepto de oops llamado abstracción de datos bajo el que hay dos categorías, una es la clase abstracta y otra es la interfaz .

La clase abstracta solo logra una abstracción parcial, pero la interfaz logra una abstracción completa.

En la interfaz solo hay métodos abstractos y variables finales … puede ampliar cualquier número de interfaz y puede implementar cualquier cantidad de clases.

Si cualquier clase está implementando la interfaz, entonces la clase también debe implementar los métodos abstractos

La interfaz no puede ser instanciada.

 interface A() { void print() } 

Esta pregunta tiene 6 años y muchas cosas han cambiado la definición de interfaz a lo largo de los años.

Desde la página de documentación de Oracle (publicar versión Java 8):

En el lenguaje de progtwigción Java, una interfaz es un tipo de referencia, similar a una clase, que puede contener solo constantes, firmas de métodos, métodos predeterminados, métodos estáticos y tipos nesteds . Los cuerpos de método existen solo para métodos predeterminados y métodos estáticos. No se pueden crear instancias de interfaces: solo pueden implementarse por clases o extenderse por otras interfaces.

Eche un vistazo a las preguntas relacionadas SE para una mejor explicación:

¿Hay más en una interfaz que tener los métodos correctos?

¿Cuál es la diferencia entre una interfaz y una clase abstracta?

Al igual que una clase, una interfaz puede tener métodos y variables, pero los métodos declarados en la interfaz son abstractos por defecto (solo firma de método, sin cuerpo).

  • Las interfaces especifican qué debe hacer una clase y no cómo. Es el plano de la clase.
  • Una interfaz se trata de capacidades, como un jugador puede ser una interfaz y cualquier jugador de implementación de clase debe poder (o debe implementar) mover (). Por lo tanto, especifica un conjunto de métodos que la clase debe implementar.

  • Si una clase implementa una interfaz y no proporciona cuerpos de método para todas las funciones especificadas en la interfaz, entonces la clase debe declararse abstracta.

Las interfaces se utilizan para implementar la abstracción . Entonces, surge la pregunta de por qué usar interfaces cuando tenemos clases abstractas.

La razón es que las clases abstractas pueden contener variables no finales, mientras que las variables en la interfaz son finales, públicas y estáticas .

Nuevas características agregadas en las interfaces en JDK 8

  1. Antes de JDK 8, la interfaz no podía definir la implementación. Ahora podemos agregar la implementación predeterminada para los métodos de interfaz. Esta implementación predeterminada tiene un uso especial y no afecta la intención detrás de las interfaces.

    Supongamos que necesitamos agregar una nueva función en una interfaz existente. Obviamente, el código anterior no funcionará ya que las clases no han implementado esas nuevas funciones. Entonces, con la ayuda de la implementación predeterminada, le daremos un cuerpo predeterminado para las funciones recién agregadas. Entonces los viejos códigos seguirán funcionando.

  2. En JDK 8, ahora podemos definir métodos estáticos en interfaces que pueden llamarse independientemente sin un objeto. Nota: estos métodos no son heredados.

Lo que es
Una interfaz es un tipo de referencia, al igual que una clase . Estos son los dos tipos principales de referencia en Java.

Qué contiene
Una interfaz puede contener un subconjunto de lo que una clase normal puede contener. Esto incluye todo lo que es static , tanto métodos y variables como declaraciones de métodos no static . No está permitido tener variables no static .
Una statement de un método difiere de un método normal en varias cosas; aquí hay uno como un ejemplo:

 [public] [abstract] ReturnType methodName(); 

Estas declaraciones se pueden marcar como public y abstract , como se representa con [optional braces] . No es necesario hacerlo, ya que es el predeterminado. private , protected , package-private (también conocido como nothing) y el modificador final no están permitidos y marcados como un error del comstackdor. No tienen implementación, por lo que hay un punto y coma en lugar de llaves.

A partir de Java 8, pueden contener métodos no static con una implementación, estos deben estar marcados con el modificador default . Sin embargo, se aplican las mismas restricciones que a los otros modificadores (agregando que strictfp ahora es válido y el abstract ya no existe).

Para qué es útil
Uno de sus usos es que se use como una cara para un servicio. Cuando dos partes trabajan juntas para formar un tipo de relación servicio-solicitante y proveedor de servicios, el proveedor del servicio proporciona la cara del servicio (en cuanto a cómo se ve el servicio) en forma de una interfaz.
Uno de los conceptos de OOP es “Abstracción”, que significa ocultar el funcionamiento complejo de los sistemas y mostrar solo lo que es necesario para comprender el sistema. Esto ayuda a visualizar el funcionamiento de un sistema complejo. Esto se puede lograr a través de la interfaz donde en cada módulo se visualiza (y también se implementa) para trabajar a través de la interfaz de otro módulo

Una interfaz es una construcción tipo clase que contiene solo constantes y métodos abstractos (Introducción a la progtwigción java, nd). Además, puede extender más de una interfaz, por ejemplo, una Superclase. Java permite solo una herencia única para la extensión de clase, pero permite múltiples extensiones para las interfaces (Introducción a la progtwigción de Java, nd) Por ejemplo,

 public class NewClass extends BaseClass implements Interface1, ..., InterfaceN { ... } 

En segundo lugar, las interfaces se pueden usar para especificar el comportamiento de los objetos en una clase. Sin embargo, no pueden contener métodos abstractos. Además, una interfaz puede heredar otras interfaces utilizando la palabra clave extends.

 public interface NewInterface extends Interface1, ... , InterfaceN { } 

Referencia

Introducción a la Progtwigción Java. Interfaces y clases abstractas (nd). Consultado el 10 de marzo de 2017 desde https://viewer.gcu.edu/7NNUKW

En general, preferimos interfaces cuando hay dos son más implementaciones que tenemos. Donde la interfaz actúa como protocolo.

Codificación para la interfaz, no implementaciones La encoding para la interfaz hace que la pareja sea poco pareja.

Una interfaz es un tipo de referencia en Java . Es similar a la clase. Es una colección de métodos abstractos. Una clase implementa una interfaz, heredando así los métodos abstractos de la interfaz. Junto con los métodos abstractos, una interfaz también puede contener constantes, métodos predeterminados, métodos estáticos y tipos nesteds. para más detalles

La interfaz es un contrato. Un ejemplo simple es un Inquilino y un Propietario que son las dos partes y el contrato es el Contrato de Alquiler . El acuerdo de renta contiene varias cláusulas que los inquilinos deben seguir. Asimismo, Interface es un contacto que contiene varios métodos (Declaración) que la Parte debe implementar (proporcionar cuerpos de métodos). Aquí uno es la clase que implementa la interfaz y el segundo es Cliente y la forma de usar e interactuar es tener “Referencia”. de la interfaz “y” Objeto de la clase de implementación “: a continuación hay 3 componentes: (explicado con la ayuda del ejemplo)

Componente 1] Interfaz: el contrato

 interface myInterface{ public void myMethod(); } 

Componente 2] Clase de implementación: Parte número 1

  class myClass implements myInterface { @Override public void myMethod() { System.out.println("in MyMethod"); } } 

Componente 3] Código de cliente: Parte número 2

  Client.java public class Client { public static void main(String[] args) { myInterface mi = new myClass(); // Reference of Interface = Object of Implementing Class mi.myMethod(); // this will print in MyMethod } }