2012-08-16 14 views
6

Tengo una pregunta en mi mente, ¿Por qué no puede ser una variable miembro en Interface? No es constante. La lógica de ser estática me hizo pensar que si uno tiene que acceder a la variable de Interface entonces debe para que sea estático, ya que no podemos crear la instancia de la interfaz, pero ¿por qué surge la necesidad de final? El código siguiente muestra cómo las variables miembro de interconexión se hacen static final a pesar de que no menciona por defecto ....Miembro Las variables de una interfaz deben ser definitivas ... ¿Por qué?

interface inter{ 

     int a=10; // It becomes final static by default 

     public void interFunc(); 
} 

class cls implements inter{ 

     public void interFunc(){ 

      System.out.println("In Class Method WITH a's Value as --> "+a); 
     } 
} 

class Test{ 

     public static void main(String[] args){ 

      inter in= new cls(); 

      in.interFunc();  
      } 
} 

Gracias de antemano !!!

+0

duplicados de http://stackoverflow.com/questions/2430756/why-are-interface-variables-static-and-final-by-default –

Respuesta

4

Bueno, para una variable de miembro, creo que debe ser estático ya que el objeto no se puede crear para la interfaz, para acceder a la variable miembro se necesita tenerla estática y acceder a ella a través de la clase.

0

Las variables de interfaz son estáticas porque las interfaces de Java no se pueden instanciar por sí mismas; el valor de la variable debe asignarse en un contexto estático en el que no existe instancia. El modificador final asegura que el valor asignado a la variable de interfaz es una constante verdadera que no puede ser reasignada por el código del programa. y tenga en cuenta que se usa una interfaz para mostrar "qué" va a tener que implementar no cómo hacerlo. entonces las variables deben ser finales (porque las variables no estáticas no están relacionadas con la especificación completa de una clase).

+0

favor incluya un enlace a la fuente de la cita. Además, el marcado '> stuff' se puede usar para citar" cosas ". –

+0

ok ... Bueno, gracias amigo ... Esto es algo que explica bien algunas webs aquí ... :) – AnkitChhajed

0

Las variables miembro de Java tienen que ser definitivas por defecto ya que no se supone que las interfaces se creen. También son estáticos por defecto. Por lo tanto, no puede cambiar su valor y tampoco puede reasignarlos una vez que se hayan asignado. Here's algo en las interfaces. Espero eso ayude.

11

La interfaz no es una clase, es un conjunto de reglas y no puede crearse una instancia, entonces no puede contener ningún contenedor de datos volátil dentro. Solo se pueden establecer constantes dentro de la interfaz, aunque no se recomienda porque se declaran constantes en las interfaces violates encapsulation approach.

+2

+1 para el "no lo hagas" :) –

+0

No relacionado con la pregunta, pero no veo cómo la constante declarada en una interfaz (conocimiento compartido) viola la encapsulación. A menos que el suministro de interfaces también sea una violación de la encapsulación. Sin embargo, todo se explica en el enlace: declare tantas variables en la interfaz como sea necesario: simplemente use 'static import' en lugar de implementarlo/extenderlo. – uvsmtid

0

Java- No implementa la herencia múltiple Pero por la interfaz que podemos lograr.

interface i1{ 
    int a=1; 
} 

interface i2{ 
    int a=2; 
} 

class exampleInterface implements i1,i2{ 
    public static void main(String...a){ 

     //As interface members are static we can write like this 
     //If its not static then we'll write sysout(a) ... which gives ambiguity error. 
     //That's why it is static. 

     System.out.println(i2.a); 
    } 
} 

Ahora, ya que es estática que debe ser final, porque si no es definitiva luego cualquier clase de implementación que va a cambiar el valor y otra clase que implementa la interfaz recibirá el valor cambiado. como por ejemplo a continuación si la clase x tiene r como static no final.

class x{ 
    static int r=10; 
} 

class y extends x{ 
    static void fun(){ 
     x.r=20; 
     System.out.println(x.r); 
    } 
} 

class m extends x{ 
    void fun(){ 
     System.out.println(x.r); 
    } 
} 

public class Test{ 
    public static void main(String[] args) { 

     y.fun(); 
     m obj=new m(); 
     obj.fun(); 
    } 
} 
Cuestiones relacionadas