Considere un ejemplo (que se 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é está incluido en Java? ¿Hay una historia para la interfaz abstracta?
Respuestas:
No es.
Las interfaces y sus métodos son implícitamente
abstract
y agregar ese modificador no hace ninguna diferencia.No, se aplican las mismas reglas. El método debe ser implementado por cualquier clase de implementación (concreta).
Interesante pregunta. Desenterré la primera edición de JLS, e incluso allí dice "Este modificador está obsoleto y no debe usarse en nuevos programas Java" .
Bien, cavando aún más ... Después de golpear numerosos enlaces rotos, logré encontrar una copia de la especificación original de Oak 0.2 (o "manual"). ¡Lectura bastante interesante, debo decir, y solo 38 páginas en total! :-)
En la Sección 5, Interfaces, proporciona el siguiente ejemplo:
Y en el margen dice
Suponiendo que
=0
fue reemplazado por laabstract
palabra clave, sospecho queabstract
en algún momento era obligatorio para los métodos de interfaz.Artículo relacionado: Java: interfaces abstractas y métodos de interfaz abstracta
fuente
abstract
frente a los métodos de interfaz.No es necesario, es opcional, al igual que
public
en los métodos de interfaz.Vea el JLS sobre esto:
http://java.sun.com/docs/books/jls/second_edition/html/interfaces.doc.html
Y
fuente
No es necesario declarar el resumen de la interfaz.
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.
Sin embargo, nadie te detiene.
Otras cosas que puede declarar explícitamente, pero no necesita:
extends Object
Una interfaz ya es "abstracta". Aplicar esa palabra clave nuevamente no hace absolutamente ninguna diferencia.
fuente
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
@Autowired
. Espero que spring / eclipse@Autowired
observe este atributo y advierta / falle sobre el uso de los mismos.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
. (Llamo a esta interfaz XXXSpec)fuente
[La especificación del lenguaje Java - 9.1.1.1
abstract
Interfaces]También tenga en cuenta que los métodos de miembro de interfaz son implícitamente
public abstract
.[La especificación del lenguaje Java - 9.2 Miembros de la interfaz]
¿Por qué son implícitos esos modificadores? No hay otro modificador (ni siquiera el modificador ' sin modificador ') que sea útil aquí, por lo que no tiene que escribirlo explícitamente.
fuente
No es necesario Es una peculiaridad del lenguaje.
fuente
No es necesario, ya que las interfaces son abstractas por defecto, ya que todos los métodos en una interfaz son abstractos.
fuente
Una interfaz abstracta no es tan redundante como todo el mundo parece decir, al menos en teoría.
Una interfaz se puede ampliar, al igual que una clase. Si diseña una jerarquía de Interfaz para su aplicación, puede tener una Interfaz 'Base', puede ampliar otras Interfaces desde, pero no desea, como un Objeto en sí mismo.
Ejemplo:
No desea que una Clase implemente MyBaseInterface, solo las otras dos, MMyDog y MyBoat, pero ambas interfaces comparten la interfaz MyBaseInterface, por lo que tienen una propiedad 'nombre'.
Sé que es un poco académico, pero pensé que algunos podrían encontrarlo interesante. :-)
En realidad, es solo un 'marcador' en este caso, para indicar a los implementadores de la interfaz que no fue diseñado para implementarse 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.
fuente
Bueno, 'Interfaz abstracta' es una construcción léxica: http://en.wikipedia.org/wiki/Lexical_analysis .
Es requerido por el compilador, también puedes escribir
interface
.Bueno, no entres 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 por alguna compatibilidad con versiones anteriores, intenta concentrarte en la construcción léxica central.
La esencia de `interface 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 características se pueden representar por espacio o por tiempo. Cuando están representados por el espacio (almacenamiento de memoria) significa que su clase concreta implementará un campo y método / métodos que operarán 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) para que tenga una compensación entre el espacio y el tiempo para la implementación de características.
Si su clase concreta no implementa todas las características, nuevamente se vuelve abstracta porque tiene una implementación de su pensamiento o idea o abstracción pero no está completa, especifíquela por
abstract
clase.Una clase concreta será una clase / conjunto de clases que capturará completamente la abstracción que está tratando de capturar la clase XYZ.
Entonces el patrón es
fuente
"It seams like you are new to Java
. De Verdad?abstract
es obsoleto en la interfaz. Quería saber por qué sigue siendo aceptable y cuál es el historial detrás de laabstract
interfaz. Me estás dando una guía de Java 101 sobre resumen vs interfaz.