2012-01-11 110 views
10

當我從各種Java書籍和教程中讀到時,在接口中聲明的變量是常量,不能被覆蓋。覆蓋接口的變量?

我做了一個簡單的代碼來測試它

interface A_INTERFACE 
{ 
    int var=100; 
} 

class A_CLASS implements A_INTERFACE 
{ 
    int var=99; 
    //test 
    void printx() 
    { 
     System.out.println("var = " + var); 
    } 
} 

class hello 
{ 

    public static void main(String[] args) 
    { 
     new A_CLASS().printx(); 
    } 
} 

,並打印出 VAR = 99

是VAR得到覆蓋?我完全困惑。謝謝你的任何建議!


非常感謝大家!我對這個界面很新。 「影子」是理解這一點的關鍵詞。我現在查閱相關資料並瞭解它。

+0

你不是「覆蓋」的變量,只有一個方法。 – 2012-01-11 04:30:34

回答

11

它沒有被覆蓋,而是被隱藏,因爲接口中的常量也是靜態的,所以會產生額外的混淆。

試試這個:

A_INTERFACE o = new A_CLASS(); 
System.out.println(o.var); 

你應該得到一個編譯時警告有關在非靜態的方式訪問靜態字段。

現在這個

A_CLASS o = new A_CLASS(); 
System.out.println(o.var); 
System.out.println(A_INTERFACE.var); // bad name, btw since it is const 
4

在一個界面中的任何變量的默認簽名是

public static final ... 

所以你不能無論如何覆蓋它。

0

您在該接口中聲明的變量對實現它的類不可見。

如果您在靜態和最終(即常量)中聲明變量,那麼它對於實現者是可見的。

+2

它是'static'和'final'和'public'(憑藉在'interface'中) – Thilo 2012-01-11 04:32:31

10

你沒有覆蓋變量,你被隱藏它與一個全新的實例變量聲明在一個更具體的範圍。這是您的printx方法中打印的變量。