2016-07-30 110 views
0

爲什麼當在匿名內部類定義中重新定義相同的數據時,從接口構造的匿名內部類從接口返回數據?請看看這段代碼,它出現在界面和匿名類中的字段,使用相同的名稱得到訪問:接口類型的匿名內部類訪問'overrided'字段

interface Item{ 
    int data=0; 
    String text=""; 
} 
public class Problem2{ 
    public static void main(String[] args){ 
    Item item=new Item(){ public int data=2; public String text="an item"; 
          public boolean equals(Object object){ 
           if(object instanceof Item){ 
           Item test=(Item)object; //tests on next line 
           System.out.println(test); System.out.println(String.format("data: %d; text: \"%s\"", test.data, test.text)); //returns data and text fields of interface, after returning fields defined in anonymous class on toString call 
           System.out.println(test); //toString returns same 
           return data==test.data && text.equals(test.text); } return false;} 
          public String toString(){return String.format("{data: %d; text: \"%s\"}", data, text);} }; 

    System.out.println(((Object)item).equals(item)); //returns false 
    } 
} 

請解釋它是如何返回,而等領域的接口領域匿名內部類不會更改。 輸出:

{data: 2; text: "an item"} 
data: 0; text: "" 
{data: 2; text: "an item"} 
false 
+0

好吧,我明白了,原來這是說,那個被傳遞的項目接口參數預期爲不變...因此,item.data和item.text被視爲final,隱式指定在接口中。 –

+0

我認爲你要找的是抽象類,而不是接口。 – Rogue

回答

1
在Java

不能覆蓋變量

你只有當你鍵入test.data將參考接口數據不是本地變量(本地覆蓋方法

這裏在創建匿名類變量可以直接使用this.data或data訪問),因爲您在接口類型的對象上發佈了.data。

解決您發出只使用getter方法

這裏充滿例如

interface Item{ 
    int data=0; 
    String text=""; 
public int getData(); 
public String getText(); 

} 
public class Test12{ 
    public static void main(String[] args){ 
     Item item=new Item(){ public int data=2; public String text="an item"; 
      public int getData(){ 
       return data; 
      } 
      public String getText(){ 
       return text; 
      } 
      public boolean equals(Object object){ 
       if(object instanceof Item){ 
        Item test=(Item)object; //tests on next line 
        System.out.println(test); System.out.println(String.format("data: %d; text: \"%s\"", test.getData(), test.getData())); //returns data and text fields of interface, after returning fields defined in anonymous class on toString call 
        System.out.println(test); //toString returns same 
        return data==test.getData() && text.equals(test.getText()); } return false;} 
      public String toString(){return String.format("{data: %d; text: \"%s\"}", data, text);} }; 

     System.out.println(((Object)item).equals(item)); //returns false 
    } 
} 
+0

謝謝,就是這樣。 –

0

您的變量沒有得到重寫,你是指2 DIFF組變量,在界面中的總是public static final,這意味着基本常數,在匿名的定義是沒有的。根據您如何引用它們,輸出會發生變化。

+0

這就是我所看到的。但同樣的事情也發生在類上......當我引用item.data或item.text時,它顯示了類定義的默認值,即使我在匿名內部類中忽略了它們。班級成員不是最後的。 –

+0

@DannyP。你不覆蓋接口中的變量,因爲在接口中聲明的變量默認是final的,所以它們不能被覆蓋,更不用說是靜態的,這意味着它們不是狀態變量,與匿名類不同。 –