接口类型的匿名内部类访问 'overrided' 个字段
anonymous innerclass of interface type accesses 'overrided' fields
为什么在匿名内部 class 定义中重新定义相同的数据时,从接口 return 构造的匿名内部 class 数据来自接口。请看一下这段代码,它显示接口中的字段和匿名 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
}
}
请解释它是如何return接口的字段而匿名内部class的字段不变的。
输出:
{data: 2; text: "an item"}
data: 0; text: ""
{data: 2; text: "an item"}
false
您的变量没有被覆盖,您指的是 2 个不同的变量集,接口中的变量总是 public static final
,这意味着基本上是常量,匿名定义不是。根据您引用它们的方式,输出会发生变化。
在 java 你 不能 覆盖变量
你只覆盖方法
并且在此处创建匿名 class 时,当您键入 test.data 时,它将引用接口数据而不是局部变量(使用 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
}
}
为什么在匿名内部 class 定义中重新定义相同的数据时,从接口 return 构造的匿名内部 class 数据来自接口。请看一下这段代码,它显示接口中的字段和匿名 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
}
}
请解释它是如何return接口的字段而匿名内部class的字段不变的。 输出:
{data: 2; text: "an item"}
data: 0; text: ""
{data: 2; text: "an item"}
false
您的变量没有被覆盖,您指的是 2 个不同的变量集,接口中的变量总是 public static final
,这意味着基本上是常量,匿名定义不是。根据您引用它们的方式,输出会发生变化。
在 java 你 不能 覆盖变量
你只覆盖方法
并且在此处创建匿名 class 时,当您键入 test.data 时,它将引用接口数据而不是局部变量(使用 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
}
}