2009-09-29 6 views
5

que tiene la siguiente interfaz en JavaEn Java, ¿cuándo debería usar un método abstracto en una interfaz?

public interface IFoo 
{ 
    public abstract void foo(); 
    public void bar(); 
} 

¿Cuál es la diferencia entre foo() y bar()? ¿Cuándo debo usar el resumen?

Ambos parecen haber realizado lo que deseo, a menos que me falta algo sutil?

actualización duplicado de Why would one declare a Java interface method as abstract?

+0

¿Eso realmente compila? –

+1

Compila; solo que el modificador abstracto es redundante. – Anoop

+3

Parece una estafa de esta pregunta - http://stackoverflow.com/questions/641536/why-would-one-declare-a-java-interface-method-as-abstract –

Respuesta

18

No hay ninguna diferencia funcional. No se proporciona ninguna implementación en una interfaz Java, por lo que todas las declaraciones de métodos son implícitamente abstractas.

Véase [1]: http://java.sun.com/docs/books/tutorial/java/IandI/abstract.html

una cita directa formar lo anterior:

Nota: Todos los métodos en una interfaz (ver la sección de Interfaces) son implícitamente extracto, por lo que el modificador abstract no se usa con métodos de interfaz (podría ser, simplemente no es necesario).

2

abstract en este escenario es innecesario (como está marcando métodos en las interfaces como public).

Usted haría lugar utilizar esto en un método en una clase abstracta con el fin de hacer cumplir su primordial por una subclase.

3

Tanto lograr los mismos, ya que todos los métodos en una interfaz son abstractos.

2

No hay diferencia entre las declaraciones. Conceptualmente, todos los métodos en una interfaz son abstractos.

17

métodos de interfaz son tanto public y abstract por defecto. No hay diferencia entre foo() y bar() y se puede retirar de forma segura todos los public y abstract palabras clave.

+4

No diría "por defecto" sino más bien "implícitamente". "Por defecto" podría interpretarse ya que existen otras opciones además de "resumen público". –

5

Usted no está perdiendo nada. Desde el Java Language Specification:

Cada declaración de método en el cuerpo de una interfaz es implícitamente abstracto, por lo que su cuerpo es siempre representado por un punto y coma, no un bloque .

Cada declaración de método en el cuerpo de una interfaz es implícitamente pública.

En otras palabras, se puede omitir el public así como la abstract en los métodos de interfaz.

4

Es redundante (no hay diferencia entre las dos declaraciones) y desanimado explícitamente en section 9.4 de la especificación del lenguaje Java:

Para la compatibilidad con versiones anteriores de la plataforma Java, se permite pero desalienta, como una cuestión de estilo, para especificar de forma redundante el modificador abstracto para los métodos declarados en las interfaces .

Y public es igualmente innecesario y desanimado:

Está permitido, pero desaconseja encarecidamente como una cuestión de estilo, especificar redundantemente el modificador pública de métodos de interfaz.

no sé qué es public fuertemente desanimado pero abstract es sólo desalentado ...

+1

Solo especulación ... pero para la palabra clave abstracta, es redundante y bastante obvia, no hay implementación allí. Es fácil de reconocer si conoce el concepto general de interfaces. Si se especificó el modificador público, podría llevar a que alguien que no conoce público sea la opción predeterminada (y única) para pensar que puede cambiar el modificador de acceso a otra cosa. – Nate

0

Tanto foo() y bar() son abstractas, ya que se declaran dentro de una interfaz. La palabra abstracta que usaste aquí no tiene importancia; será mejor que la elimines.

0

Las interfaces en java son iguales "de alguna manera" a las clases totalmente abstractas, por lo que agregar la palabra clave "abstracta" a una declaración de método en una interfaz no tiene nada que ver con el método.

Cuestiones relacionadas