子类中所有的构造方法默认都会访问父类中空参的构造方法

因为子类会继承父类中的数据, 可能会使用父类的数据, 所以,子类初始化之前, 一定要先完成父类数据的初始化

每一个构造方法的第一条语句默认都是: super()
public class Father {
    public Father() {
        System.out.println("Father的无参构造");
    }
}
public class Son extends Father {
    public Son() {
        System.out.println("Son的无参构造");
    }
}
public static void main(String[] args) {
    // Father的无参构造
    // Son的无参构造
    Son son = new Son();
}

==============================带参构造==============================

public class Father {
    public Father() {
        System.out.println("Father的无参构造");
    }
    public Father(String name) {
        System.out.println("Father的带参构造");
    }
}
public class Son extends Father {
    public Son() {
        System.out.println("Son的无参构造");
    }
    public Son(String name) {
        System.out.println("Son的带参构造");
    }
}
public static void main(String[] args) {
    // Father的无参构造
    // Son的带参构造
    Son son = new Son("XYZ");
}
父类未书写构造方法, 会默认提供一个无参构造方法; 书写了构造方法, 不会提供默认的无参构造方法
父类中没有无参构造方法, 那么子类的构造方法会出现什么问题? 如何解决
问题; 编译报错
解决
    1、在父类中加一个无参构造方法
    2、通过使用super关键字去显示的调用父类的带参构造方法
    3、子类通过 this去调用本类的其他构造方法
子类中一定要有一个去访问父类的构造方法, 否则父类数据就没有初始化

=============== 一个类的执行流程:静态代码块>构造代码块>构造方法代码块===============

public class Father {

    static {
        System.out.println("Father的静态代码块");
    }

    {
        System.out.println("Father的构造代码块");
    }

    public Father() {
        System.out.println("Father的无参构造方法");
    }
}
public class Son extends Father {

    static {
        System.out.println("Son的静态代码块");
    }

    {
        System.out.println("Son的构造代码块");
    }

    public Son() {
        System.out.println("Son的无参构造方法");
    }
}
public static void main(String[] args) {
    // Father的静态代码块
    // Son的静态代码块
    // Father的构造代码块
    // Father的无参构造方法
    // Son的构造代码块
    // Son的无参构造方法
    Son son = new Son();
}

===============成员变量初始化(默认初始化>显示初始化)>构造方法初始化=============== 

public class Pr {
    static {
        System.out.println("Pr的静态代码块");
    }

    Ps ps = new Ps();
    // 这段代码(构造代码块)和 Ps ps = new Ps();谁写在前面就先初始化谁
    {
        System.out.println("Pr的构造代码块");
    }


    public Pr() {
        System.out.println("Pr");
    }
}
public class Ps {
    public Ps() {
        System.out.println("Ps");
    }
}
public class Ae extends Pr {
    Ps ps = new Ps();

    public Ae() {
        // super():仅表示要先初始化父类数据, 再初始化子类数据(初始化时按照分层初始化进行的)
        super();
        System.out.println("Ae");
    }
}
public static void main(String[] args) {
    // Pr的静态代码块
    // Ps
    // Pr的构造代码块
    // Pr
    // Ps
    // Ae
    new Ae();
}
03-08 06:56