java - 接口(interface)类型的匿名内部类访问 'overrided'字段

标签 java interface anonymous-inner-class

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

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
  }
}

请解释一下它是如何返回接口(interface)的字段而匿名内部类的字段不改变的。 输出:

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

最佳答案

在java中你不能覆盖变量

你只重写方法

在这里,当您创建匿名类时,当您键入 test.data 时,它将引用接口(interface)数据而不是局部变量(可以使用 this.data 或直接使用 data 访问局部变量),因为您在 的对象上发出了 .data接口(interface)类型。

要解决您的问题,只需使用 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
    }
}

关于java - 接口(interface)类型的匿名内部类访问 'overrided'字段,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/38679409/

相关文章:

java - Android WebView 在 Android 4.2.2 上无法加载 url

java - 为什么 Java 接口(interface)在文档中有描述

typescript - 是否可以为 typescript 中的接口(interface)函数提供默认参数?

Scala:具有匿名类型的抽象类

Java匿名内部类声明

java - 无法使用 InjectMocks-Mockito 实例化模拟对象

java - 如何编写正则表达式以从字符串中删除所有字母字符

java - 同时从不同的计算机上部分下载文件

C++ 模板和子类?

java - 局部内部类是否在定义它们的范围内维护所有局部变量的副本?