2016-07-30 217 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的,所以它们不能被覆盖,更不用说是静态的,这意味着它们不是状态变量,与匿名类不同。 –