Java 为什么要有接口?什么时候用接口?


       本人考虑了这个问题很久,在网上也看过很多资料,这里讲一下我的理解。

1. 多继承

       C++ 中有多继承的概念,即一个类可以有多个直接父类。这么做很灵活,但是如果两个父类中有同名方法或者同名的函数,就比较麻烦了(指定访问域)。Java 的一个好处是只允许一个类有一个直接父类,(部分原因是)考虑到弥补没有多继承带来的一些问题,有了接口。

2. 接口与类

       接口可以看作是一种特殊的类,接口与类的重要区别是,接口中的方法必须要重写(接口中类方法默认抽象),而类不同,子类即便是不重写父类的方法,也是没有问题的,甚至可以通过 super 关键字,调用父类的方法。这也意味着,接口比起类要更加规范,要用接口这个“父类”,必须要重写其中的方法。
       另一方面,接口是相对简单的,只用提供接口方法即可,实现的逻辑可以交给继承了接口的类来完成。另外,接口比抽象类要好,原因也在于接口允许多继承。
       试想,一个婴儿类,如果继承了手接口、脚接口等,最后实现的就会是一个健康的婴儿,要修改各个部分的功能也比较简单(增加接口方法,或者修改类中方法逻辑即可),如果是继承一个 Human 类,如果父类中有一部分出现问题,子类就会出问题,而且人类的所有功能糅杂在一个类中,功能也不好划分。接口则提供了一种功能规范,实现了这种规范就能够实现一种功能,并且逻辑是继承了接口的类负责实现的,降低了接口本身出错的可能性。

同属某一父类的子类间的差异性(什么时候用接口?)

       接口较之于类,可以实现更低层次上的抽象。例如动物类,作为父类,可以有一个 move 方法(所有动物都可以移动),但是对于同属于动物的猪、狮子类,如何从功能上区别这两个类?一个办法是在原父类和子类之间再加上三个类:肉食动物类、草食动物类、杂食动物类,每个动物类都有选择地去继承这几个类。
       但是这样做会有问题,因为继承级数的增加,方法名、变量名都有可能出现同名的情况,原因在于父类的某些字段或者属性,对子类来说有可能是不可见的,子类实现时,无法对父类的情况完全可见,有可能造成冲突。
       接口则不同,接口想要被继承,其中的接口方法一定是要暴露出来的,子类也必须要全部实现这些方法,只要按照规范来做事,就可以避免出错的情况。继续分析上面的例子,如果把肉食动物类、草食动物类、杂食动物类改为三个接口,狮子继承肉食动物接口,实现其中的 hunt (捕猎)方法;猪实现杂食动物接口,实现其中的方法;这样就可以让狮子类和猪类同属于动物类(最高级别抽象),但又分别实现了不同的接口(不同的食性,低一级的抽象)。

总结

       接口的好处有很多,用它的理由也有很多,需要在实战中去感受。我认为从抽象的级别来理解接口与类是比较好的办法。


免责声明!

本站转载的文章为个人学习借鉴使用,本站对版权不负任何法律责任。如果侵犯了您的隐私权益,请联系本站邮箱yoyou2525@163.com删除。



 
粤ICP备18138465号  © 2018-2025 CODEPRJ.COM