组合
通俗的说法为一个类持有另一个类的对象,即通常所说的has-a关系,代码表现的简单形式为:
class A{ } class B{ private A a; }
组合的情况非常常见,它使得两个类建立了一种不是那么强烈的关系,如果修改A类里的细节,并不会影响到B;
继承
继承,类似父与子的关系,即非常熟悉的is-a关系,代码表现的简单形式为:
class Father{ private int a; Father() { } Father(int a) { } } class Son extends Father{ Son() { } Son(int a) { super(a); } }
继承使用extends关键字,子类基础基类(父类);
基类和子类中调用顺序问题:
在子类调用自己的构造器时,会先调用基类的构造器,如果此时,父类中含有静态代码块,非静态代码块,子类中也含有静态代码块,非静态代码块,此时的调用顺序如何,代码如下:
class Father{ static { int static_data = 0; System.out.println("调用父类中的静态代码块"); } { int data = 0; System.out.println("调用父类中的非静态代码块"); } //private int a; Father() { // System.out.println(static_data); System.out.println("调用父类的构造函数"); } } class Son extends Father{ static { int static_data = 0; System.out.println("调用子类中的静态代码块"); } { int data = 0; System.out.println("调用子类中的非静态代码块"); } Son() { System.out.println("调用子类的构造函数"); } } public class test2 { public static void main(String[] args) { Son son = new Son(); } }
输出如下:
关于什么时候选择组合,何时选择继承,由于项目经验较少,理解也不是非常到位:
想在新类中使用现有类的功能而非它的接口这种情形,使用组合。在新类中嵌入某个对象,让其实现所需要的功能,但新类的用户看到的只是为新类所定义的接口,而非所嵌入对象的接口。
继承情形,使用某个现有类,并开发一个它的特殊版本,意味着使用一个通用类,并为了某种特殊需要而将其特殊化。
应优先考虑组合情况,后考虑继承。