为什么 human.x=10 和 human.test(0) 在带有匿名内部类的 Java 中编译错误?

Why are human.x=10 and human.test(0) compile error in Java with anonymous inner class?

提问人:Dilshan Dekumpitiya 提问时间:2/22/2023 最后编辑:marc_sDilshan Dekumpitiya 更新时间:11/22/2023 访问量:55

问:

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);

java oop 编译器错误 匿名类

评论

0赞 tevemadar 2/22/2023
您收到的实际错误消息是什么?
0赞 Dilshan Dekumpitiya 2/22/2023
找不到符号 x 和方法测试
1赞 f1sh 2/22/2023
因为您将变量声明为 . 既没有字段也没有方法。HumanHumanxtest

答:

6赞 Joachim Sauer 2/22/2023 #1

该类型既没有字段也没有方法,变量被定义为该类型。Humanxtest()human

您的匿名内部类具有该字段和方法,因此您需要将变量定义为该类型。但是“匿名”意味着它没有名字,所以你不能只是用那个不存在的名字来代替。Human

但是,如果使用 ,则局部变量类型推断将为变量提供该匿名类的类型,因此替换为将使代码编译。varHuman 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编译时类型为 ,因此在使用该引用时,您可以访问类未定义的成员(无论是数据成员还是方法)。HumanHuman

使用匿名类这一事实无关紧要 - 如果使用命名类进行扩展,则会发生相同的编译器错误: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
}