2009-08-24 10 views
23

Al igual que un contrapunto a this question: ¿qué es una interfaz en Java?¿Qué es una interfaz en Java?

+4

¿Estamos votando su respuesta a su pregunta que ha publicado de inmediato? –

+6

Votebait, en mi humilde opinión. – PaulJWilliams

+3

Blatant Votebait, sí. ¿Por qué es esto un problema? ¿Es la pregunta legítima? ¿Se agrega al conocimiento almacenado en SO? Estas parecen preocupaciones más relevantes que mis puntos de reputación. – Imagist

Respuesta

42

Una interfaz es una forma especial de una clase abstracta que no implementa ningún método. En Java, se crea una interfaz de la siguiente manera:

interface Interface 
{ 
    void interfaceMethod(); 
} 

Desde la interfaz no se puede aplicar cualquier método, que da a entender que la cosa entera, incluyendo todos los métodos, son tanto públicos como resumen (resumen en Java términos medios "no implementado por esta clase"). Por lo que la interfaz anterior es idéntica a la interfaz a continuación:

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

Para utilizar esta interfaz, sólo hay que 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 bien, si quieres puedes escribir un método como éste:

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, usted podría Nunca 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 allí e no es interfaceMethodB() en interfaceA. Del mismo modo, z es del 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(); 
} 

Se podría heredar 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 se podría cambiar la interfaz y la clase abstracta como esto:

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 compilación, ya que tiene una implementación para implementedMethod(). Si usted quiere poner en práctica el método, pero no ser capaz de crear una instancia de la clase, usted tiene que hacerlo de esta manera:

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

Eso no es mucho de una clase abstracta debido a que ninguno de sus miembros son abstractos, pero es Java legal

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 compilación, no porque las clases están vacías, sino porque InheritsFromTwoAbstractClasses está tratando de heredar de dos clases abstractas, lo cual es ilegal. Lo siguiente es perfectamente legal.

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

La primera diferencia entre las interfaces y clases abstractas es la razón por 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 ningún problema con el código anterior debido InterfaceA y 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 
{ } 

Este es exactamente el mismo que nuestro otro ejemplo, excepto que ya se nos permite implementar métodos en clases abstractas, lo hicimos, y debido a que don' Tenemos que implementar métodos ya implementados en una clase heredada, pero no fue así. Pero puede haber notado, hay un problema. ¿Qué sucede cuando llamamos al new InheritsFromTwoAbstractClasses().method()? ¿Imprime "Hola" o "Adiós"? Probablemente no lo sepas, y tampoco el compilador 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 que el 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 se deberían ejecutarse, pero agregar funcionalidad a las clases que se están "mezclados" a través de la herencia. Obviamente, no hay problema para averiguar qué sucede si llama al new InheritsFromTwoAbstractClasses().hi() o new InheritsFromTwoAbstractClasses().bye(), pero no puede hacerlo porque Java no lo permite.

(sé que esto es un post largo, así que si hay algún error en ella por favor hágamelo saber y voy a corregirlos.)

+5

Una pequeña observación, llama a su clase "InheritsFromTwoInterfaces", pero cuando usa interfaces generalmente no habla de Heredar, sino de Implementar, esto porque la interfaz no contiene ninguna lógica y/o implementación que pueda heredar. Por lo tanto, es mejor hablar sobre la implementación (al menos eso es lo que me aprendieron). – Gertjan

+2

@Gertjan Estás en lo correcto.Sin embargo, no creo que la distinción entre "heredar" e "implementar" sea tan importante, especialmente considerando que en muchos casos uno hereda e implementa una clase abstracta. Elegí mantener el esquema de nombres para ser menos confuso. La interfaz – Imagist

+0

es como una tubería a través de la cual puede acceder a diferentes clases de objetos de forma estandarizada. Como en Java no se puede extender más de una clase, la interfaz está aquí para satisfacer la necesidad de una herencia más compleja. –

0

Una interfaz en Java es un modelo 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í se muestra un ejemplo para la comprensión de 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(); 
} 
} 
0

Interface es el plano de una clase.

No es el concepto de una programación orientada a objetos llamada abstracción datos virtud de que hay dos categorías uno es clase abstracta y otro es 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 implementa la interfaz entonces la clase tiene que implementar los métodos abstractos demasiado

interfaz no puede ser instanciada.

interface A() { 
    void print() 
} 
0

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

Desde la página de Oracle documentation (Java 8 liberación de correos):

En el lenguaje de programación Java, una interfaz es un tipo de referencia, similar a una clase, que puede contener solamente constantes, firmas de método, por defecto métodos, métodos estáticos y tipos anidados. 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.

Tener un vistazo a las preguntas SE relacionados para una mejor explicación:

Is there more to an interface than having the correct methods

What is the difference between an interface and abstract class?

0

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

  • Las interfaces especifican qué debe hacer una clase y no cómo. Es el modelo de la clase.
  • Una interfaz se trata de capacidades como un jugador puede ser una interfaz y cualquier jugador implementador 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 método cuerpos para todas las funciones especificadas en la interfaz, entonces la clase abstracta debe ser declarada.

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 añadidas en las interfaces en el JDK 8

  1. Antes de JDK 8, la interfaz no podía definir la implementación. Podemos ahora 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 , 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.
0

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

Lo que contiene
Una interfaz puede contener un subconjunto de lo normal de una clase puede contener. Esto incluye todo lo que es static, ambos métodos y variables, y las declaraciones de métodos que no sean static. No está permitido tener variables que no sean static.
Una declaración de un método difiere de un método normal en varias cosas; He aquí un ejemplo:

[public] [abstract] ReturnType methodName(); 

Estas declaraciones se pueden marcar como public y abstract, tal 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 compilador. No tienen implementación, por lo que hay un punto y coma en lugar de llaves.

A partir de Java 8, que puede mantener static métodos no con una implementación, estos tienen que ser 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 abstract ya no existe).

Lo que es útil para
Uno de sus usos es para que pueda ser utilizado como una cara de un servicio.Cuando dos partes trabajan juntas para formar un tipo de relación de proveedor de servicio de solicitante de servicio &, el proveedor de servicio proporciona la cara del servicio (en cuanto a cómo se ve el servicio) en forma de 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 interfaz donde en cada módulo se visualiza (y también implementó) a trabajar a través de la interfaz de otro módulo

0

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

Codificación a la interfaz, no a las implementaciones La codificación a 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 anidados. para obtener más details

0

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

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

En segundo lugar, las interfaces pueden utilizarse 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 programación Java. Interfaces y clases abstractas (n.d). Consultado el 10 de marzo de 2017 desde https://viewer.gcu.edu/7NNUKW

+0

Asegúrate de utilizar las opciones de formato para que quede claro dónde tienes el código, y cuando las explicaciones: 'código' usando' \ '' y bloques '\' \ '\' ' – unmultimedio

Cuestiones relacionadas