组合和继承

组合

通俗的说法为一个类持有另一个类的对象,即通常所说的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();
    }
}

输出如下:

关于什么时候选择组合,何时选择继承,由于项目经验较少,理解也不是非常到位:

想在新类中使用现有类的功能而非它的接口这种情形,使用组合。在新类中嵌入某个对象,让其实现所需要的功能,但新类的用户看到的只是为新类所定义的接口,而非所嵌入对象的接口。

继承情形,使用某个现有类,并开发一个它的特殊版本,意味着使用一个通用类,并为了某种特殊需要而将其特殊化。

应优先考虑组合情况,后考虑继承。

原文地址:https://www.cnblogs.com/xuhan74520/p/13802593.html