2012-05-20 29 views
6

En la interfaz de Java, solo podemos tener variables finales. También podemos crear variables estáticas en la interfaz. Pero, al mismo tiempo, no podemos crear métodos estáticos/finales ya que Interface solo está destinado a métodos estáticos.¿Por qué los métodos de interfaz no pueden ser "estáticos" y "finales"?

¿Cuál es exactamente el motivo para no permitir los métodos estáticos/finales en la interfaz?

+0

pregunta duplicada –

Respuesta

4

Las interfaces se definen por instancias, no estáticas.

"final" significa "no se puede anular". Eso no tiene sentido para una interfaz de ningún tipo.

11

Un método final no puede anularse. Eso desafía el propósito de tener una interfaz si no puedes implementar el método.

Para la parte estática, consulte this question.

2

Porque están ahí en una interfaz para ser implementados por alguna clase. ¿Cuál sería el objetivo de un método que no puede tener una implementación en cualquier lugar? (que es lo que sugeriría el final)

3

final significa que no se puede anular.

static significa que solo se puede invocar con el nombre de clase. Dado que una interfaz tendrá múltiples implementaciones, ¿cómo sabrá qué implementación elegir ya que la interfaz no puede implementar el método en sí mismo?

6

Lo entendiste mal.

  1. Todas las variables son implícitamente public static y final en las interfaces.

  2. Antes de Java 8, no puede crear métodos estáticos en las interfaces. Todos los métodos son métodos de instancia.

  3. Dado que el único objetivo de una interfaz es tener clases implementándolas, y dado que los métodos en interfaces no pueden tener ninguna implementación, hacer que sean definitivas no tendría sentido: no tendrían implementación y no podrían anularse .

+0

@LukasEder Gracias por la edición. –

0

Los métodos bien estáticos funcionan en clases y no en instancias tan extrañas e inútiles. Habiendo dicho eso, por alguna razón, quería esto en algunas situaciones, aunque ahora no puedo recordar un caso, así que debe haber sido hace mucho tiempo.

Usted puede "evitar" esto, sin embargo (diseño bastante alternativa API) como interfaces le permiten declarar clases, así que algo como esto:

interface MyInterface { 

    static class Helpers { 
     static void myStaticMethod(); //can be abstract etc as usual 
    } 
} 

Usted puede subclase que etc clase con normalidad por supuesto, como bien hacerlo abstracto, métodos abstractos, etc.

1

Una interfaz es una clase abstracta pura. Por lo tanto, todos los métodos en una interfaz son abtract, y deben implementarse en las clases secundarias. Entonces, por extensión, ninguno de ellos puede declararse como final.

+0

Creo que quieres decir "ninguno de ellos puede declararse como definitivo" – duffymo

0

No podemos declarar el método de interfaz como estático porque el método del método de instancia de la interfaz y no podemos declarar el final porque es necesario anular el método de la interfaz en la clase implementada. Descripción de comprobar este enlace enter link description here

1
Why Interface methods cannot be “static” & “final”? 

Todos los métodos en una interfaz son explícitamente abstracto y, por tanto, no se puede definir como estática o final, ya que los métodos estáticos o finales no pueden ser abstracta.

1

En el contexto de Java 8 y los métodos por defecto, esta pregunta tiene un significado nuevo. static métodos ahora están permitidos, y por qué final métodos aún no son posibles is explained in this question.

1

1: no podemos declarar un método final, porque contradice su regla ya que el método final no puede anularse, pero siempre debe definir todos los métodos de interfaz en las clases implementadas.

2: no podemos declarar un método estático, porque contradice su regla ya que el método estático siempre necesita el cuerpo del método pero no podemos definir ningún método dentro de una interfaz.

2

que tienen un punto más para demostrar por qué métodos de interfaz no pueden ser estáticos:

interface MyInterface { 
     static void myStaticMethod();  
} 

Ahora vamos a tener dos clases están implementando "MyInterface"

// primera clase

class MyClass1 implements MyInterface { 
static void myStaticMethod(){ 
// some implementation 
    } 
} 

// segunda clase

class MyClass2 implements MyInterface { 
static void myStaticMethod(){ 
// some implementation 
    } 
} 

Ahora estoy instanciando como a continuación:

1- MyInterface myObj1 = new MyClass1(); 2- myObj1.myStaticMethod();

3- MyInterface myObj2 = new MyClass2(); 4- myObj2.myStaticMethod();

// aquí en la línea 2 & 4, que es llamada equivocada como myStaticMethod debería ser llamado usando nombre de la clase (porque myStaticMethod se define como estática), como a continuación:

MyInterface.myStaticMethod(); -> Pero en este caso, cómo llamar a diferentes implementaciones de myStaticMethod() por MyClass1 & clases MyClass2.

Por lo tanto, se ha demostrado que no es posible aplicar estática en la declaración del método de interfaz.

Para el final, está bastante claro que va a optar por anular la funcionalidad.

+0

'MyInterface.myStaticMethod()', solo la declaración no se puede implementar en 'MyInterface'. Indirectamente estás diciendo que 'clase' y' interfaz' son lo mismo. –

Cuestiones relacionadas