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);
编译错误?
类型
Human
没有字段 x
或方法 test()
并且您的变量 human
被定义为该类型。
您的匿名内部类具有该字段和该方法,因此您需要将变量定义为该类型。但“匿名”意味着它没有名称,因此您不能将
Human
替换为不存在的名称。
但是,如果您使用
var
,则局部变量类型推断将为该变量提供该匿名类的类型,因此将 Human human = ...
替换为 var human =
将使您的代码编译。
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
}