【问题标题】:anonymous innerclass of interface type accesses 'overrided' fields接口类型的匿名内部类访问“覆盖”字段
【发布时间】:2016-07-30 23:26:13
【问题描述】:

当在匿名内部类定义中重新定义相同的数据时,为什么从接口构造的匿名内部类会从接口返回数据。请看一下这段代码,它似乎访问了接口中的字段和匿名类,同名:

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

【问题讨论】:

  • 好的,我明白了,也就是说,传入的 Item 接口参数预计是不可变的......因此 item.data 和 item.text 被视为最终的,在接口中隐式指定。
  • 我认为您正在寻找的是抽象类,而不是接口。

标签: java interface anonymous-inner-class


【解决方案1】:

在java中你不能覆盖变量

你只覆盖方法

在这里,当您键入 test.data 时创建 anon 类时,它将引用接口数据而不是局部变量(使用 this.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
    }
}

【讨论】:

  • 谢谢,就是这样。
【解决方案2】:

您的变量没有被覆盖,您指的是 2 个不同的变量集,接口中的变量始终是public static final,这意味着基本上是常量,匿名定义不是。根据您引用它们的方式,输出会发生变化。

【讨论】:

  • 这也是我看到的。但是同样的事情也会发生在类中......当我引用 item.data 或 item.text 时,它会显示类定义中的默认值,即使我在匿名内部类中覆盖了它们。类成员不是最终的。
  • @DannyP。您没有覆盖接口中的变量,因为接口中声明的变量默认为 final,它们不能被覆盖,更不用说 static,这意味着它们不是状态变量,与您的匿名类不同。
猜你喜欢
  • 1970-01-01
  • 2023-03-28
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2012-09-15
相关资源
最近更新 更多