Java接口的实用性
示例
在许多情况下,接口都可能非常有用。例如,假设您有一个动物列表,并且想遍历该列表,每个动物都打印它们发出的声音。
{cat, dog, bird}
一种方法是使用接口。这将允许在所有类上调用相同的方法
public interface Animal { public String getSound(); }
任何implementsAnimal也必须具有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,则无需对接口执行的操作进行任何更改。