Java匿名内部类中human.x=10与human.test()编译报错原因解析
为什么
human.x=10;和human.test();会出现编译错误? 这是Java静态类型检查和向上转型的特性导致的:
你声明的变量human类型是Human,哪怕它实际指向的是一个继承自Human的匿名内部类实例,编译阶段编译器只会基于Human这个声明类型来检查成员是否存在:
- 对于
human.x = 10;:父类Human里根本没有定义x这个成员变量,虽然你在匿名内部类里新增了这个变量,但编译器不认——它只看Human类的结构,所以会报找不到符号的错误。 - 对于
human.test();:同样的道理,Human类中没有test()方法,这个方法是你在匿名内部类里新增的,不属于父类Human的方法集合,编译时自然找不到这个方法。
简单说:父类型的引用只能访问父类(或父类继承来的)的成员,没法直接访问子类/匿名类新增的成员。
如果想验证匿名类里的x和test()确实存在,你可以用Java 10+的var关键字声明变量:
var human = new Human() { // 匿名类内容不变 }; human.x = 10; // 此时编译通过 human.test(); // 此时编译通过
因为var会让变量类型自动推断为匿名内部类的实际类型,而不是父类Human。
附原代码:
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 } }
内容的提问来源于stack exchange,提问作者Dilshan Dekumpitiya
相关产品推荐
相关产品推荐

