Interfaz abstracta de Java


Considere un ejemplo (que compila en java)

public abstract interface Interface {
    public void interfacing();
    public abstract boolean interfacing(boolean really);
}

¿Por qué es necesario que una interfaz sea "declarada" abstracta? ¿Hay otras reglas que se aplican con una interfaz abstracta?


Finalmente: Si abstract es obsoleto, ¿por qué se incluye en Java? ¿Hay un historial para abstract interface?

Author: Kevin Panko, 2011-08-26

9 answers

¿Por qué es necesario que una interfaz sea "declarada" abstracta?

No lo es.

public abstract interface Interface {
       \___.__/
           |
           '----> Neither this...

    public void interfacing();
    public abstract boolean interfacing(boolean really);
           \___.__/
               |
               '----> nor this, are necessary.
}

Las interfaces y sus métodos son implícitamente abstract y agregar ese modificador no hace ninguna diferencia.

¿Hay otras reglas que se aplican con una interfaz abstracta?

No, se aplican las mismas reglas. El método debe ser implementado por cualquier clase de implementación (concreta).

Si abstract es obsoleto, ¿por qué se incluye en Java? Hay un ¿historia de la interfaz abstracta?

Pregunta Interesante. Desenterré la primera edición de JLS, e incluso allí dice "Este modificador es obsoleto y no debe usarse en nuevos programas Java".

Está bien, cavando aún más... Después de golpear numerosos enlaces rotos, me las arreglé para encontrar una copia del original Roble 0.2 Especificación (o "manual"). Muy interesante leer debo decir, y solo 38 páginas en total! :-)

En la Sección 5, Interfaces, proporciona el siguiente ejemplo:

public interface Storing {
    void freezeDry(Stream s) = 0;
    void reconstitute(Stream s) = 0;
}

Y en el margen dice:

En el futuro, la parte "= 0 " de declarar métodos en interfaces puede desaparecer.

Suponiendo que =0 fue reemplazado por la palabra clave abstract, sospecho que abstract fue en algún momento obligatorio para los métodos de interfaz!


Artículo relacionado: Java: Interfaces abstractas y métodos de interfaz abstractos

 425
Author: aioobe,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2016-10-29 03:51:34

No es necesario, es opcional, al igual que public en los métodos de interfaz.

Vea la JLS sobre esto:

Http://java.sun.com/docs/books/jls/second_edition/html/interfaces.doc.html

9.1.1.1 interfaces abstractas Cada interfaz es implícitamente abstracta. Este modificador es obsoleto y no debe usarse en programas nuevos.

Y

9.4 Declaraciones de Métodos abstractos

[...]

Para la compatibilidad con versiones anteriores de la plataforma Java, es permitido pero desalentado, como cuestión de estilo, a redundantemente especifique el modificador abstracto para los métodos declarados en interfaces.

Se permite, pero se desaconseja fuertemente como una cuestión de estilo, especifique redundantemente el modificador público para los métodos de interfaz.

 35
Author: Lukas Eder,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2011-08-26 09:25:26

No es necesario declarar la interfaz abstracta.

Al igual que declarar todos esos métodos públicos (que ya son si la interfaz es pública) o abstractos (que ya están en una interfaz) es redundante.

Nadie te está deteniendo, sin embargo.

Otras cosas que puede indicar explícitamente, pero no es necesario:

  • llama a super () en la primera línea de un constructor
  • extends Object
  • implementar interfaces heredadas

¿Hay otras reglas que se aplican con una interfaz abstracta?

Una interfaz ya es "abstracta". Aplicar esa palabra clave de nuevo no hace absolutamente ninguna diferencia.

 12
Author: Thilo,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2011-08-26 09:25:45

Tenga en cuenta que en primavera tiene un significado no académico. La interfaz abstracta es una advertencia al desarrollador para que no la use para @Autowired. Espero que spring / eclipse @Autowired mire este atributo y advierta/falle sobre los usos de tal.

Un ejemplo real: @Service proxy bajo @Transnational a un @Repository necesita usar los mismos métodos básicos sin embargo deben usar diferentes interfaces que extiendan esta interfaz abstracta debido a @Autowired. (Yo llamo a esta interfaz XXXSpec)

 6
Author: Adi Lev,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2014-09-11 20:32:26

Cada interfaz es implícitamente abstracta.
Este modificador es obsoleto y no debe usarse en programas nuevos.

[La Especificación del Lenguaje Java - 9.1.1.1 abstract Interfaces]

También tenga en cuenta que los métodos miembros de interfaz son implícitamente public abstract.
[La Especificación del Lenguaje Java-9.2 Miembros de la Interfaz]

¿Por qué están implícitos esos modificadores? No hay otro modificador (ni siquiera el'no modifier ' -modificador) que sería útil aquí, por lo que no tiene que escribirlo explícitamente.

 3
Author: kapex,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2012-10-05 11:17:14

No Es necesario. Es una peculiaridad del lenguaje.

 2
Author: Bohemian,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2011-08-26 09:26:37

No es necesario, ya que las interfaces son abstractas por defecto, ya que todos los métodos de una interfaz son abstractos.

 2
Author: Swagatika,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2012-08-07 11:42:48

Una interfaz abstracta no es tan redundante como todo el mundo parece estar diciendo, al menos en teoría.

Una interfaz se puede extender, al igual que una Clase. Si diseña una jerarquía de interfaz para su aplicación, puede tener una Interfaz 'Base', puede extender otras Interfaces desde pero no quiero como un Objeto en sí mismo.

Ejemplo:

public abstract interface MyBaseInterface {
    public String getName();
}

public interface MyBoat extends MyBaseInterface {
    public String getMastSize();
}

public interface MyDog extends MyBaseInterface {
    public long tinsOfFoodPerDay();
}

No desea que una Clase implemente la MyBaseInterface, solo las otras dos, MMyDog y MyBoat, pero ambas interfaces comparten la Interfaz MyBaseInterface, por lo que tiene una propiedad 'name'.

Sé que es un poco académico, pero pensé que algunos podrían encontrarlo interesante. :-)

Es realmente solo un 'marcador' en este caso, para señalar a los implementadores de la interfaz que no fue diseñado para ser implementado por sí solo. Debo señalar que un compilador (Al menos el sun/ora 1.6 con el que lo probé) compila una clase que implementa una interfaz abstracta.

 -3
Author: Eurospoofer,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2013-07-25 19:58:16

Bien 'Interfaz abstracta' es una construcción léxica: http://en.wikipedia.org/wiki/Lexical_analysis .

Es requerido por el compilador, también podría escribir interface.

Bueno, no se metan demasiado en la construcción léxica del lenguaje, ya que podrían haberlo puesto allí para resolver alguna ambigüedad de compilación que se denomina casos especiales durante el proceso de compilación o para alguna compatibilidad con versiones anteriores, trate de centrarse en la construcción léxica central.

La esencia de 'la interfaz es capturar algún concepto abstracto (idea/pensamiento/pensamiento de orden superior, etc.) cuya implementación puede variar ... es decir, puede haber implementación múltiple.

Una interfaz es un tipo de datos abstracto puro que representa las características del Objeto que está capturando o representando.

Las entidades pueden ser representadas por espacio o por tiempo. Cuando están representados por espacio (almacenamiento de memoria) significa que su clase concreta implementará un campo y método / métodos que operar en ese campo o por tiempo, lo que significa que la tarea de implementar la característica es puramente computacional (requiere más relojes de cpu para el procesamiento), por lo que tiene un intercambio entre espacio y tiempo para la implementación de la característica.

Si su clase concreta no implementa todas las características , de nuevo se vuelve abstracta porque tiene una implementación de su pensamiento o idea o abstracción, pero no está completa, la especifica por abstract clase.

Una clase concreta será una clase / conjunto de clases que capturarán completamente la abstracción que está tratando de capturar la clase XYZ.

Así que el Patrón es

Interface--->Abstract class/Abstract classes(depends)-->Concrete class
 -3
Author: Manish,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2015-04-29 03:47:53