You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.30 17:11:13