接口的用处

在许多情况下,接口可能非常有用。例如,假设你有一个动物列表,并且你想要遍历列表,每个都打印它们所发出的声音。

{cat, dog, bird}

一种方法是使用接口。这将允许在所有类上调用相同的方法

public interface Animal {
    public String getSound();
}

implements Animal 中的任何类也必须有 getSound() 方法,但它们都可以有不同的实现

public class Dog implements Animal {
    public String getSound() {
        return "Woof";
    }
}

public class Cat implements Animal {
    public String getSound() {
        return "Meow";
    }
}

public class Bird implements Animal{
    public String getSound() {
        return "Chirp";
    }
}

我们现在有三个不同的类,每个类都有一个 getSound() 方法。因为所有这些类都是 implement 接口,它声明了 getSound() 方法,所以 Animal 的任何实例都可以在其上调用 getSound()

Animal dog = new Dog();
Animal cat = new Cat();
Animal bird = new Bird();

dog.getSound(); // "Woof"
cat.getSound(); // "Meow"
bird.getSound(); // "Chirp"

因为这些都是 Animal,我们甚至可以把动物放在一个列表中,循环遍历它们并打印出它们的声音

Animal[] animals = { new Dog(), new Cat(), new Bird() };
for (Animal animal : animals) {
    System.out.println(animal.getSound());
}

因为阵列的顺序是 DogCat,然后是 BirdWoof Meow Chirp 将被打印到控制台。

接口也可以用作函数的返回值。例如,如果输入是 dog 则返回 Dog ,如果输入是 cat返回 Cat,如果是 bird 则返回 Bird ,然后打印该动物的声音可以使用

public Animal getAnimalByName(String name) {
    switch(name.toLowerCase()) {
        case "dog":
            return new Dog();
        case "cat":
            return new Cat();
        case "bird":
            return new Bird();
        default:
            return null;
    }
}

public String getAnimalSoundByName(String name){
    Animal animal = getAnimalByName(name);
    if (animal == null) {
        return null;
    } else { 
        return animal.getSound();
    }
}

String dogSound = getAnimalSoundByName("dog"); // "Woof"
String catSound = getAnimalSoundByName("cat"); // "Meow"
String birdSound = getAnimalSoundByName("bird"); // "Chirp"
String lightbulbSound = getAnimalSoundByName("lightbulb"); // null

接口对于可扩展性也很有用,因为如果要添加新类型的 Animal,则不需要使用对它们执行的操作来更改任何内容。