本帖最后由 衣带赞 于 2013-11-27 03:47 编辑
首先,感谢楼主提出这个问题,这个问题在我刚看到这个视频时也想过,不过没有深究。现在时间充裕了,就查了下资料,弄懂这个问题了,不然估计还是不懂。
可以明确的说,如果你只有一两个类需要实现接口,那确实没有必要去实现它。但是当你有很多个类要实现某个接口的时候,它的作用就体现出来了。接口可以大大减少编程的复杂程度,具体实现我用个最简单的例子来说明。
比如你要开一个宠物店,卖各种宠物的食物,用代码来体现就是这样的:
- class Cat {
- public void buy(){
- System.out.println("我是猫,我要买猫粮");
- }
- }
- class Dog {
- public void buy(){
- System.out.println("我是狗,我要买狗粮");
- }
- }
- //然后下面这个类就是店主你
- public class Person{
- public static void main(String[] args){
- Cat c = new Cat();
- c.buy();
- Dog d = new Dog();
- d.buy();
- }
- }
复制代码 这样,你就成功的卖给了猫、狗粮食。但是你想过没有,如果不是两个动物,而是几十个,甚至上百个种类的宠物来你的店里买粮食,你需要new上百个类,来实现其中的方法,而且最糟糕的是你还必须知道是什么宠物来你的店里买粮食(也就是说你必须知道是调用哪个类中的方法,比如这个类中有buy()方法,那个中没有,你没有用接口标记,还要一行一行的去查原代码!),这个复杂程度可想而知。
接下来,我用接口来实现这个例子:
- interface PetBuy{ //定义一个宠物购买粮食的接口
- public void buy();
- }
- class Cat implements PetBuy{
- public void buy(){
- System.out.println("我是猫,我要买猫粮");
- }
- }
- class Dog implements PetBuy{
- public void buy(){
- System.out.println("我是狗,我要买狗粮");
- }
- }
- /*这个仍然是店主你卖粮食,但是,这时你觉得请一个售货员帮你卖比较好,这样你根本就
- 不需要new什么各种宠物的对象,也不需要知道是什么宠物来买你的粮食*/
- //接下来创建一个售货员类
- class Salesclerk{
- public void buy(PetBuy pet){
- pet.buy(); //接收一个接口,以父类调用子类中的方法
- }
- }
- //这个还是店主你的类
- public class Person{
- public static void main(String[] args){
- PetBuy cat = new Cat(); //实例化一个猫
- PetBuy dog = new Dog(); //实例化一个狗
- Salesclerk s = new Salesclerk(); //实例化一个售货员
- s.buy(cat); //把猫给售货员
- s.buy(dog); //把狗给售货员
- }
- }
复制代码 这样,你就只创建了一个售货员,让售货员卖了猫粮、狗粮。如果上百个种类的宠物来你的店里买粮食,而你只需要实例化宠物的对象即可,根本就不需要知道是什么宠物来买你的粮食,直接用 s 来调用各个对象的方法,这样是不是方便管理了很多呢。
最后打个最简单比喻,你在大街上饿了,看到一个店子挂了KFC的牌子,你就可以直接进去买鸡腿、圣代。但是如果所有店子都不挂牌子,店里仍然做同样的事情,你就得一家一家门面进去问里面是不是有鸡腿、圣代卖。这就是反射了,反射的性能是很差的,而且我们要记的代码量剧增,远不如使用接口这样易于管理。
所以说接口最重要的作用就是标记,方便程序员分层管理,思路条理更加清晰。这个还是一层的例子,如果有多层,一层一层往下调用,果如不用接口,那简直是一场遭难!
比如说你这个店主开了10多家店铺,每个店铺卖不同的东西。。。如果不用接口分层管理,而是直接new每个顾客对象来调用其中方法的话,上千个类你就得都记下来。。。而且新增的类没标记你也根本也无法知晓。
|