在网上搜了很多关于使用接口的意义,大多数的文章都指出创建了一套规则,规范了实现接口的类的规则;为写代码提供了很大的规范上的作用;或是仅仅只是教你一下接口怎么实现;
老实说,怎么定义接口,怎么在类里实现,其实非常好懂,而我最不理解的是,既然接口要求实现他的类实现接口中规定的统一的方法。那我不定义接口,在类中或同样标识(返回值,方法名,参数,访问权限)的方法不就好了吗,他的意义在哪里呢?
经过反复阅读网友们不同的解释和代码演示,本人总结出一个使用接口的意义,如果还有更多的实际使用的意义,还请网友们补充;
下面我们先来讨论一下实际编程中的问题;比如说我有一个动物列表,里面有很多类型的动物,如狗,鸟,鱼;狗爱吃骨头,会叫barking,移动方式是跑,工作是看家,鸟和鱼吃虫子,鸟会唱歌,会飞,没有工作,鱼不会叫,也没有工作,鱼会游。它们属于三种不同的动物;
现在我要列出三种动物不同的行为,至少需要三个变量组来存放同一种类的动物,并依次遍历他们的行为。如果后期程序中要加入其他不同类型的动物,比如猫,他的工作是抓老鼠,我们就要重新去定义一个新的变量组出来,用来存放不同的猫,再来遍历猫的行为;或是我要把鱼从代码中去掉,代码的修改工作比较大。而使用接口就能很好的解决这个问题:
接下去我们来看一下具体的代码(相信有编程实践的朋友一眼就能看懂其中的意义)
先定义一个动物行为的接口:
package InterfaceTest;
public interface AnimalAction {
public void eat();
public void move();
public void whistler();
public void work();
}
再定义狗,鸟,鱼三类动物,并实现行为接口:
类:狗
package InterfaceTest;
public class Dog implements AnimalAction {
public String name;
public Dog(String DogName) {
name = DogName;
}
public void eat() {
System.out.println(name + " is a dog,Likes eat bone.");
}
public void move() {
System.out.println(name + " is a dog,Move Type is Run.");
}
public void whistler() {
System.out.println(name + " is a dog,Whistler type is barking.");
}
public void work() {
System.out.println(name + " is a dog,work is look house.");
}
}
类:鸟
package InterfaceTest;
public class Bird implements AnimalAction {
public String name;
public Bird(String BirdName) {
name = BirdName;
}
public void eat() {
System.out.println(name + " is a Bird,Likes eat insect.");
}
public void move() {
System.out.println(name + " is a Bird,Move Type is Fly.");
}
public void whistler() {
System.out.println(name + " is a Bird,Whistler type is sing.");
}
public void work() {
System.out.println(name + " is a Bird,no work.");
}
}
类:鱼
package InterfaceTest;
public class Fish implements AnimalAction {
public String name;
public Fish(String FishName) {
name = FishName;
}
public void eat() {
System.out.println(name + " is a Fish,Likes eat insect.");
}
public void move() {
System.out.println(name + " is a Fish,Move Type is Fly.");
}
public void whistler() {
System.out.println(name + " is a Fish,cannot Whistler.");
}
public void work() {
System.out.println(name + " is a Fish no work.");
}
}
最后应用的代码:
package InterfaceTest;
public class AnimalInterfaceTest {
public static void main(String args[]) {
AnimalAction animals[] = { new Dog("James"), new Bird("Lingling"), new Dog("wangwang"), new Bird("bingle"),
new Fish("Kingk") };
for (int i = 0; i <= animals.length; i++) {
animals[i].eat();
animals[i].move();
animals[i].whistler();
animals[i].work();
System.out.println("*************************************");
}
}
}
关键的代码:
AnimalAction animals[] = { new Dog("James"), new Bird("Lingling"), new Dog("wangwang"), new Bird("bingle"),
new Fish("Kingk") };
他们多种不同类型的动物挂在了一个列表变量上;在后续代码中遍历时,只需要一个循环就可以了。而且在增加不同动物类型时,只要实现了AnimalAction接口,可以在定义时直接挂接到列表变量组中。for语句中的循环不需要做任何修改;
编写此文为自已留下可查阅的技术文档,也希望能帮助需要的网友解答疑惑。相信接口应使用场景不止于些,欢迎网友补充。
--------------------------------------------------------------------------------------------------------------------------------
补充一个通过迭代器遍历集合的方法:
package InterfaceTest;
import java.util.ArrayList;
import java.util.Iterator;
import java.util.List;
public class AnimalInterfaceTest {
public static void main(String args[]) {
List<AnimalAction> animals = new ArrayList<AnimalAction>();
animals.add(new Dog("James"));
animals.add(new Bird("Lingling"));
animals.add(new Dog("wangwang"));
animals.add(new Bird("bingle"));
animals.add(new Fish("Kingk"));
Iterator<AnimalAction> ite = animals.iterator();
while (ite.hasNext())// 判断下一个元素之后有值
{
AnimalAction a = ite.next();
a.eat();
a.move();
a.whistler();
a.work();
System.out.println("*************************************");
}
}
}