作者热门文章
- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
为什么从接口(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/
我是一名优秀的程序员,十分优秀!