Java接口的实用性

示例

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

{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都是Animal声明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());
}

因为阵列的顺序是Dog,Cat,然后Bird,“汪喵啁啾”将被打印到控制台。

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

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"); // 空值

接口对于扩展性也很有用,因为如果您想添加的新类型Animal,则无需对接口执行的操作进行任何更改。