package com.atguigu.test01.block; public class TestInit { public static void main(String[] args) { /* Father f = new Father(); //父类的无参构造 */ /* * Son s = new Son(); * 父类的无参构造 子类的无参构造 */ //Son s2 = new Son("atguigu"); /* * 父类的无参构造 子类的有参构造 */ Son s3 = new Son("atguigu", 10); /* * 父类的无参构造 子类的有参构造1 子类的有参构造2 */ } } class Father{ public Father(){ System.out.println("父类的无参构造"); } } class Son extends Father{ private String str; private int num; public Son(){ //隐含了super(); 子类的构造器中一定会调用父类的构造器,默认调用父类的无参构造 System.out.println("子类的无参构造"); } public Son(String str){ //隐含了super() this.str = str; System.out.println("子类的有参构造1"); } public Son(String str,int num){ this(str); this.num = num; System.out.println("子类的有参构造2"); } }
package com.atguigu.test01.block; /* * (1)先执行父类的实例初始化方法 * 它由三部分: * ①成员变量的显式赋值 * ②非静态代码块 * ③构造器 * (2)再执行子类的实例初始化方法 * 它由三部分: * ①成员变量的显式赋值 * ②非静态代码块 * ③构造器 * * super()或super(实参列表)之前说的是调用父类的构造器,其实是调用父类对应的实例初始化方法 * super()或super(实例列表)之前说的是在子类构造器的首行,其实是在子类实例初始化方法的首行 */ public class TestInit2 { public static void main(String[] args) { Zi z = new Zi();//312645 } } class Fu{ private String strFu = assignFu(); { System.out.println("(1)父类的非静态代码块"); } public Fu(){ System.out.println("(2)父类的无参构造"); } public String assignFu(){ System.out.println("(3)父类的assignFu()"); return "fu"; } } class Zi extends Fu{ private String strZi = assignZi(); { System.out.println("(4)子类的非静态代码块"); } public Zi(){ //super() ==>调用父类的实例初始化方法,而且它在子类实例初始化方法的首行 System.out.println("(5)子类的无参构造"); } public String assignZi(){ System.out.println("(6)子类的assignZi()"); return "zi"; } }
图片中蓝色字体的部分重要,this在构造器,实例初始化方法中,代表的是正在创建的对象,现在正在创建子类的对象,因为子类重写的assign(),那么执行时子类重写的assign().