继承初始化父类和子类的过程

继承初始化父类和子类的过程

一、子类和父类初始化顺序
      1、当调用某个类的构造器来创建java对象时,系统总会先调用父类的非静态初始化块进行初始化,这个调用是隐式执行。而且父类的静态初始化块总会被执行。
2、接着调用父类的一个或多个构造器执行初始化,这个调用通过super进行调用是显示调用。也可以通过隐式调用。(隐式调用:子类构造器没有super调用,也没有this调用,系统会在执行子类构造器之前,隐式调用父类无参的构造器)
3、所有的父类非静态初始化块、构造器依次调用完毕后,系统调用本类的非静态初始化块,构造器执行初始化,最后返回本类的实例。

二、子类和父类初始化顺序实例
package java022;
class Creature{
	{
		System.out.println("Creature的非静态初始化块");
	}
	//定义两个构造器
	public Creature(){
		System.out.println("Creature无参数的构造器");
	}
	
	public Creature(String name){
		//使用this调用无参数的重载构造器Creature()
		this();
		System.out.println("Creature带有一个参数name的构造器:"+name);
	}
}

class Animal extends Creature{
	{
		System.out.print("Animal非静态初始化块");
	}
	public Animal(String name){
		super(name);
		System.out.println("Animal带有一个参数的构造器,name参数:"+name);
	}
	public Animal(String name,int age){
		//使用this调用本类的另一个重载构造器Animal(String name)
		System.out.println("Animal带有两个参数的构造器,其age:"+age);
	}
}

class Wolf extends Animal{
	{
		System.out.println("wolf的非静态初始块");
	}
	
	public Wolf(){
		super("小鬼当家",23);
		System.out.println("wolf无参的构造器");
	}
	public Wolf(double weight){
		//使用this调用另一个重载的构造器Wolf()
		this();
		System.out.println("wolf的带weight参数的构造器,weight参数:"+weight);
	}
}
public class InitTest {
	public static void main(String []args){
		new Wolf(9.6);
	}

}
结果
上面的程序定义了 Creature、Animal、Wolf 这3个类,其中Animal是Creature的子类,Wolf是Animal的子类。3个类都包含了非静态的初始化块,构造器。当程序创建Wolf实例时,程序会按上面的初始化步骤执行初始化。结果如下:
Creature的非静态初始化块
Creature无参数的构造器
Animal非静态初始化块Animal带有两个参数的构造器,其age:23
wolf的非静态初始块
wolf无参的构造器
wolf的带weight参数的构造器,weight参数:9.6

总结:
1、只要在程序创建java对象,系统总是会先调用顶层父类的初始化操作,包括初始化块,构造器,然后依次向下调用父类的初始化操作,最终执行本类的初始化操作,返回本类对象。
2、调用父类的哪个构造器执行初始后分为以下几个情况:
A、子类的构造器执行体的第一行代码使用super显式调用父类构造器,系统将根据super调用里传入的实参列表来确定调用父类的哪个构造器。
B、子类构造器执行体的第一行代码使用this显式调用本类中重载构造器,系统将根据this传入出实参地要用本类的另一个构造器。(然后执行本类另一个构造器时即可进入第一种情况)
C、子类构造器执行体中既没有super调用,也没有this调用,系统将会在执行子类构造器之前,隐式调用父类无参构造器。

注意:
①、super用于显示调用父类的构造器,this用于显示调用本类中另一个重载构造器。
②、super和this调用都只能在构造器中使用,而且super调用和this调用都必须作为构造器的第一行代码
③、在构造器中super和this只能使用其中之一,而且最多只能调用一次。

你可能感兴趣的:(-----【java基础】,-----【继承】,全栈测试)