正文
接口实现类,继承和组合他们之间的关系是非常重要的,或许,你现在编写代码感受不到,但是用到的时候,就会感觉,以前的设计者们的智慧。
在开始说一下比较编程的技巧之前,一起来看一看他们之前的区别吧!
接口和抽象类
抽象类:在Java中被abstract关键字修饰的类称为抽象类,被abstract关键字修饰的方法称为抽象方法,抽象方法只有方法的声明,没有方法体。抽象类的特点:
a、抽象类不能被实例化只能被继承;
b、包含抽象方法的一定是抽象类,但是抽象类不一定含有抽象方法;
c、抽象类中的抽象方法的修饰符只能为public或者protected,默认为public;
d、一个子类继承一个抽象类,则子类必须实现父类抽象方法,否则子类也必须定义为抽象类;
e、抽象类可以包含属性、方法、构造方法,但是构造方法不能用于实例化,主要用途是被子类调用。
接口:Java中接口使用interface关键字修饰,特点为:
a、接口可以包含变量、方法;变量被隐示指定为public static final修饰的,方法被隐示指定为public abstract(JDK1.8之前);
b、接口支持多继承,即一个接口可以extends多个接口,间接的解决了Java中类的单继承问题;
c、一个类可以实现多个接口;
d、JDK1.8中对接口增加了新的特性:
(1)、默认方法(default method):JDK 1.8允许给接口添加非抽象的方法实现,但必须使用default关键字修饰;定义了default的方法可以不被实现子类所实现,但只能被实现子类的对象调用;如果子类实现了多个接口,并且这些接口包含一样的默认方法,则子类必须重写默认方法;(2)、静态方法(static method):JDK 1.8中允许使用static关键字修饰一个方法,并提供实现,称为接口静态方法。接口静态方法只能通过接口调用(接口名.静态方法名)。
继承和组合
继承与组合都是面向对象中代码复用的方式。继承,父类的内部细节对子类可见,其代码属于白盒式的复用,而组合中,对象之间的内部细节不可见,其代码属于黑盒式复用。继承在编码过程中就要指定具体的父类,其关系在编译期就确定,而组合的关系一般在运行时确定。继承强调的是is-a的关系,而组合强调的是has-a的关系。
编程技巧:在编写代码的同时,如果有多个类需要调用一个公共的代码片段,这个时候,可以有2种选择来提取公共的方法。第一种:写一个公共的类,之后,用到的他的地方,分别进行引入。第二种的方式,是写一个抽象类,进而采用采用继承的方式调用他。如何选择呢?如果这个共同的代码,与需要调用他的代码关联性比较强的时候,这个时候,应该采用继承抽象类的方式实现。如果关联性不强,而且有动态改变对象的时候,这个时候,应当使用第一种的方式实现。
重要的地方:在选择如何使用组合还是继承的时候,应优先选择组合的方式,不应该选择继承的方式,因为继承的方式是属于白盒式复用,可以直接修改原来的数据结构,这样做是非常不安全的,下面给出一个以前分析的以前文章。