2012-08-16 7 views
6

私は心の中で質問がありますが、なぜインターフェイスのメンバ変数を非定数にすることはできません..静的であるという論理は、私が心に留めておくと、Interfaceの変数にアクセスする必要がある場合我々はインターフェイスのインスタンスを作成することはできませんが、最終的な必要性がなぜ必要なのか静的であるために?以下のコードは、事前に....インターフェイスメンバ変数は、我々は、デフォルトではそれを言及いけないにも関わらず、最終的な静的になっている様子メンバーインターフェイスの変数はfinalでなければなりません...なぜですか?

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

感謝を示し!!!

+0

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

答えて

4

メンバー変数については、静的にする必要があります。オブジェクトをインターフェイス用に作成できないため、メンバー変数にアクセスするには静的で、クラスを介してアクセスする必要があります。

0

インターフェイス変数は、Javaインターフェイスを独自のインスタンスでインスタンス化できないため、静的です。インスタンスの存在しない静的コンテキストで変数の値を割り当てる必要があります。最後の変更子は、インターフェイス変数に割り当てられた値が、プログラムコードによって再割り当てできない真の定数であることを保証します。 であり、インターフェースはどのようにして実装する必要があるのか​​を示すために使用されることを覚えておいてください。変数は最終的なものでなければなりません(非静的変数はクラスの仕様全体に関係しません)。

+0

の重複引用のソースへのリンクを含めてください。また、マークアップ '> stuff'を使って" stuff "を引用することもできます。 –

+0

ok ..まあ、ありがとう、友人..これは良い説明がここにいくつかのウェブをクリアするものです:) :) – AnkitChhajed

0

Javaメンバ変数は、インターフェイスがインスタンス化されていないため、デフォルトで最終的に設定する必要があります。これらはデフォルトでは静的でもあります。したがって、その値を変更することはできません。また、割り当てられた後は、その値を再割り当てすることもできません。 Here's インターフェイス上の何か。それが役に立てば幸い。

11

インターフェイスはクラスではなく、一連のルールであり、インスタンス化することはできません。内部には揮発性データコンテナを含めることはできません。インタフェース内で定数を宣言することはできませんが、インタフェース内では定数だけを設定することができますが、violates encapsulation approachの定数が宣言されています。

+2

+1の "do not do it" :) –

+0

質問とは無関係ですが、私は見ませんインタフェース(共有知識)で宣言された定数がカプセル化にどのように違反するか。インタフェースを提供することがカプセル化の違反でもない限り。しかし、それはすべてリンクで説明されています:必要なだけ多くの変数をインタフェースで宣言します。実装/拡張の代わりに 'static import'を使用してください。 – uvsmtid

0

Java-複数の継承を実装していません しかし、インタフェースによって実現できます。

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

今では静的であるように、それは最終的でなければならないので、もしその最終ない次いで その値と変更された値を受信するインタフェースを実装している 他のクラスを変更します実装する任意のクラス。たとえば、クラスxのrがstaticでない場合は、 のようになります。

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(); 
    } 
} 
関連する問題