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

问题描述 投票:0回答:2
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 class oop compiler-errors anonymous-class
2个回答
6
投票

类型

Human
没有字段
x
或方法
test()
并且您的变量
human
被定义为该类型。

您的匿名内部类具有该字段和该方法,因此您需要将变量定义为该类型。但“匿名”意味着它没有名称,因此您不能将

Human
替换为不存在的名称。

但是,如果您使用

var
,则局部变量类型推断将为该变量提供该匿名类的类型,因此将
Human human = ...
替换为
var human = 
将使您的代码编译。


1
投票

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
}
© www.soinside.com 2019 - 2024. All rights reserved.