子类中所有的构造方法默认都会访问父类中空参的构造方法
因为子类会继承父类中的数据, 可能会使用父类的数据, 所以,子类初始化之前, 一定要先完成父类数据的初始化 每一个构造方法的第一条语句默认都是: 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(); }