2012-08-16 8 views
6

Ho una domanda nella mia mente, Perché non può essere una variabile membro in Interfaccia essere un non costante .. La logica dell'essere statico era proprio nella mia mente che se si ha bisogno di accedere alla variabile di Interfaccia allora è necessario perché è statico dato che non possiamo creare l'istanza dell'interfaccia ma perché nasce la necessità del finale ?? Il codice seguente mostra come le variabili membro di interfaccia sono fatti statico finale, anche se noi non ne parla per default ....Le variabili membro di un'interfaccia devono essere definitive ... Perché?

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();  
      } 
} 

Grazie in anticipo !!!

+0

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

risposta

4

Bene per una variabile membro, penso che sia necessario essere statici in quanto non è possibile creare l'oggetto per l'interfaccia in modo che per accedere alla variabile membro sia necessario averlo statico e accedervi tramite la classe.

0

Le variabili di interfaccia sono statiche perché le interfacce Java non possono essere istanziate a loro volta; il valore della variabile deve essere assegnato in un contesto statico in cui non esiste alcuna istanza. Il modificatore finale garantisce che il valore assegnato alla variabile di interfaccia sia una costante reale che non può essere riassegnata dal codice del programma. e tieni presente che un'interfaccia viene utilizzata per mostrare "cosa" devi implementare e non come. quindi le variabili dovrebbero essere definitive (perché le variabili non statiche non sono correlate all'intera specifica di una classe).

+0

Si prega di includere un link alla fonte per la citazione. Inoltre, il markup '> stuff' può essere usato per citare" roba ". –

+0

ok .. Beh grazie amico .. Questa è una buona spiegazione che cancella alcune reti qui ... :) – AnkitChhajed

0

Le variabili membro Java devono essere definitive per impostazione predefinita in quanto le interfacce non devono essere istanziate. Sono anche statici di default. Quindi non è possibile modificare il loro valore e non è possibile riassegnarli dopo che sono stati assegnati. Here's qualcosa su interfacce. Spero che sia d'aiuto.

11

L'interfaccia non è una classe, è un insieme di regole e non può essere istanziata, quindi non può contenere alcun contenitore di dati volatile all'interno. Solo le costanti possono essere impostate all'interno dell'interfaccia, sebbene sia scoraggiata, poiché dichiara costanti nelle interfacce violates encapsulation approach.

+2

+1 per "non farlo" :) –

+0

Non correlato alla domanda, ma non vedo come costante dichiarata in un'interfaccia (conoscenza condivisa) viola l'incapsulamento. A meno che la fornitura di interfacce sia anche una violazione dell'incapsulamento. Tuttavia, è tutto spiegato nel link: dichiarare come molte variabili nell'interfaccia come richiesto - basta usare 'static import' invece di implementarlo/estenderlo. – uvsmtid

0

Java- Non implementa l'ereditarietà multipla Ma tramite l'interfaccia possiamo ottenere.

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); 
    } 
} 

Ora, come è statico dovrebbe essere finale perché se non definitiva quindi qualsiasi classe che implementa cambierà il valore e altra classe che sta attuando interfaccia riceverà valore modificato. come nell'esempio seguente se la classe x ha r come statico non finale.

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(); 
    } 
}