介面的用處

在許多情況下,介面可能非常有用。例如,假設你有一個動物列表,並且你想要遍歷列表,每個都列印它們所發出的聲音。

{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,則不需要使用對它們執行的操作來更改任何內容。