Java父类构造器的讲解

众所周知,对于Java中的所有类而言,它们有一个根父类,即java.lang.Object类。

对于Java中构造器执行的顺序而言,程序执行的顺序为,先执行父类的非静态代码块,然后执行父类的相应的构造器,最后执行子类的非静态代码块,

子类的构造器。

此处需要说明一点:Java中的静态代码是在字节码文件在最开始加载的时候就完成的哦。

为了更好的理解,请看下面的例子:

class Creature
{
	{
		System.out.println("Creature的非静态初始化块");
	}
	// 下面定义两个构造器
	public Creature()
	{
		System.out.println("Creature无参数的构造器");
	}
	public Creature(String name)
	{
		// 使用this调用另一个重载的、无参数的构造器
		this();
		System.out.println("Creature带有nmae参数的构造器,name参数:"
			+ name);
	}
}
class Animal extends Creature
{
	{
		System.out.println("Animal的非静态初始化块");
	}
	public Animal(String name)
	{
		super(name);
		System.out.println("Animal带一个参数的构造器,name参数:" + name);
	}
	public Animal(String name , int age)
	{
		// 使用this调用另一个重载的构造器
		this(name);
		System.out.println("Animal带2个参数的构造器,其age:" + age);
	}
}
class Wolf extends Animal
{
	{
		System.out.println("Wolf的非静态初始化块");
	}
	public Wolf()
	{
		// 显式调用父类的带2个参数的构造器
		super("灰太狼", 3);
		System.out.println("Wolf无参数的构造器");
	}
	public Wolf(double weight)
	{
		// 使用this调用另一个重载的构造器
		this();
		System.out.println("Wolf的带weight参数的构造器,weight参数:"
			+ weight);
	}
}
public class InitTest
{
	public static void main(String[] args)
	{
		new Wolf(5.6);
	}
}

运行结果为:

Creature的非静态初始化块
Creature无参数的构造器
Creature带有nmae参数的构造器,name参数:灰太狼
Animal的非静态初始化块
Animal带一个参数的构造器,name参数:灰太狼
Animal带2个参数的构造器,其age:3
Wolf的非静态初始化块
Wolf无参数的构造器
Wolf的带weight参数的构造器,weight参数:5.6

  

原文地址:https://www.cnblogs.com/xiohao/p/4349833.html