在 Java 中实例化接口

2022-09-01 01:44:52

我有这个界面:

public interface Animal {
    void Eat(String name);
}

这里的代码实现了接口:

public class Dog implements Animal {
    public void Eat(String food_name) {
        System.out.printf(food_name);
    }
    
    public static void main(String args[]) {
        Animal baby2 = new Dog(); // <- this line
        baby2.Eat("Meat");
    }
}

我的问题是,为什么代码有效?无法实例化接口。然而,在这种情况下,界面被实例化(用注释标记)。

这是怎么回事?


答案 1

不,它不是 - 您正在实例化 a ,但是由于 a 是一个 ,您可以将变量声明为 .如果您尝试实例化界面,它将是:DogDogAnimalAnimalAnimal

Animal baby2 = new Animal();

试试看,看着编译器惊恐地尖叫:)


答案 2

Dog不是接口:是实现接口的DogAnimal

这里没有什么不愉快的事情发生。


请注意,您可以实例化接口的匿名实现,如下所示:

Animal animal = new Animal() {
    public void Eat(String food_name) {
        System.out.printf("Someone ate " + food_name);
    }
};