接口类型的匿名内部类访问'覆盖'领域

时间:2016-07-30 23:26:14

标签: java interface anonymous-inner-class

为什么在匿名内部类定义中重新定义相同数据时,从接口构造的匿名内部类从接口返回数据。请看一下这段代码,看来界面中的字段和匿名类具有相同的名称:

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

2 个答案:

答案 0 :(得分:1)

在java中你不能覆盖变量

你只能覆盖方法

并且在输入test.data时创建anon类时,它将引用接口数据而不是本地变量(可直接使用this.data或数据访问的局部变量),因为您在对象上发出.data界面类型。

解决您的问题只需使用getter方法

这是完整的例子

foreach( $array as $key => $value )

答案 1 :(得分:0)

你的变量没有被覆盖,你指的是2个差异变量集,接口中的变量总是public static final,这意味着基本上是常量,而匿名定义则不是。{1}}。根据您的引用方式,输出会发生变化。