提问人:Dilshan Dekumpitiya 提问时间:2/22/2023 最后编辑:marc_sDilshan Dekumpitiya 更新时间:11/22/2023 访问量:55
为什么 human.x=10 和 human.test(0) 在带有匿名内部类的 Java 中编译错误?
Why are human.x=10 and human.test(0) compile error in Java with anonymous inner class?
问:
class Human {
void eat() {
System.out.println("human eat!");
}
}
public class Demo {
public static void main(String[] args) {
Human human = new Human() {
int x = 10;
public void test() {
System.out.println("test - anonymous");
}
@Override
void eat() {
System.out.println("customer eat!");
}
};
human.eat();
human.x = 10; //Illegal
human.test(); //Illegal
}
}
在此代码中,为什么是和编译错误?human.x=10;
human.test(0);
答:
6赞
Joachim Sauer
2/22/2023
#1
该类型既没有字段也没有方法,变量被定义为该类型。Human
x
test()
human
您的匿名内部类具有该字段和方法,因此您需要将变量定义为该类型。但是“匿名”意味着它没有名字,所以你不能只是用那个不存在的名字来代替。Human
但是,如果使用 ,则局部变量类型推断将为变量提供该匿名类的类型,因此替换为将使代码编译。var
Human human = ...
var human =
评论
0赞
Dilshan Dekumpitiya
2/22/2023
你能用代码格式回答吗?
4赞
Joachim Sauer
2/22/2023
@DilshanDekumpitiya:如果你阅读了答案,那么你会发现最后一句话包含了非常明确的说明,说明你的代码中需要改变什么。除此之外:不,我更喜欢提供理解,而不是分发代码进行盲目复制。
1赞
f1sh
2/22/2023
你@DilshanDekumpitiya读过这个答案吗?
1赞
Mureinik
2/22/2023
#2
human
编译时类型为 ,因此在使用该引用时,您可以访问类未定义的成员(无论是数据成员还是方法)。Human
Human
使用匿名类这一事实无关紧要 - 如果使用命名类进行扩展,则会发生相同的编译器错误:Human
public class SpecialHuman extends Human {
int x = 10;
public void test() {
System.out.println("test - anonymous");
}
@Override
void eat() {
System.out.println("customer eat!");
}
public static void main(String[] args) {
Human h = new SpecialHuman();
human.eat();
human.x = 10; //Illegal
human.test(); //Illegal
}
评论
Human
Human
x
test