2016-01-13 371 views
0

我知道它不被推薦,但爲什麼我可以聲明接口的成員變量不是靜態的?Java - 接口的非靜態成員變量

接口的靜態和非靜態成員之間有什麼區別?我看到,如果我定義一個接口的成員變量爲靜態,我可以在未靜態的方式使用它在實現類:

接口:

public interface Pinuz { 
    final static int a; 

    public void method1(); 
} 

實現類:

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

     Test t = new Test(); 
     int b = t.a; 
    } 

    @Override 
    public void method1() { 
     // TODO Auto-generated method stub 

    } 
} 

我只看到一條警告,要求我以靜態方式使用成員a。

+0

不確定你的意思。接口中的所有變量都是隱式靜態的。 – Thilo

+0

接口只能有靜態成員_variables_。方法簽名通常是非靜態的,因爲它們需要實現(從Java 8開始,有靜態默認實現,但更多的是特殊情況)。 – Thomas

回答

2

爲什麼我可以聲明接口的成員變量不是靜態的?

這是隱含static(和final)(這意味着它是static即使你省略了static關鍵字),as stated in the JLS

在接口的身體的每個字段聲明是隱式public,staticfinal。允許冗餘地爲這些字段指定任何或所有這些修飾符。

原因是決賽,任何實施可能會改變成員的值,如果它沒有定義爲final。然後該成員將成爲實現的一部分,但正如您所知,interface是純粹的抽象。

成爲static的原因是該成員屬於接口,而不是實現實例。

此外,作爲static,你應該只與類名(否則你會得到一個編譯器警告),而不是通過一些參考,讓int b = t.a;應該只是寫爲int b = Test.a;

+0

謝謝@Thilo,更新。 –

+0

好的。我被誤導的事實是,你也可以使用實例訪問靜態變量,就像在我的文章中一樣。我不知道這是可能的。 – sthor69

0

指它不能申報Java界面中的一個非靜態變量。 接口中的每個變量都是隱式的public,static和final。

0

接口的所有成員變量,無論您是否聲明它們是靜態的,都是靜態的