Java代码块与构造方法执行顺序

Java中一般有会区分静态代码块、构造代码块、构造函数执行顺序

静态代码块依赖于类而生存的, 类加载时候最先执行,只执行一次

构造代码块存在于类之下,依赖于对象而生存,不管是创建有参或者无参构造,每次创建对象时候都会执行,

构造函数与类同名,无返回值,创建对象时候执行,创建对象时,对应参数的构造才会执行

静态代码块、构造代码块、构造函数 执行顺序依次为:

父类静态代码块=》子类静态代码块=》父类构造代码块=》父类构造方法=》子类构造代码块=》子类构造方法

1、无参构造代码如下:

package com.fwl.test;

public class A {
	static {
		System.out.println("父亲静态块");
	}
	{
		System.out.println("父亲构造块");
	}

	public A() {
		System.out.println("父亲构造方法");
	}
	public static void main(String[] args) {
		new B();
		System.out.println("========类已加载,静态块不再执行========");
		new B();
	}
}

class B extends A {

	public B() {
		System.out.println("   子类构造方法");
	}

	static {
		System.out.println("   子类静态块");
	}
	{
		System.out.println("   子类构造块");
	}

}

输出结构如下:

父亲静态块
   子类静态块
父亲构造块
父亲构造方法
   子类构造块
   子类构造方法
========类已加载,静态块不再执行========
父亲构造块
父亲构造方法
   子类构造块
   子类构造方法

 

2、有参构造

public class A {
	static {
		System.out.println("父亲静态块");
	}
	{
		System.out.println("父亲构造块");
	}

	public A() {
		System.out.println("父亲构造方法");
	}
	public A(String A) {
		System.out.println("父亲有参构造方法");
	}
	public static void main(String[] args) {
		new B("11");
	}
}

class B extends A {

//	public B() {
//		System.out.println("   子类构造方法");
//	}

	public B(String B) {
		System.out.println("   子类有参构造方法");
	}

	static {
		System.out.println("   子类静态块");
	}
	{
		System.out.println("   子类构造块");
	}

}

输出结果如下:

父亲静态块
   子类静态块
父亲构造块
父亲构造方法
   子类构造块
   子类有参构造方法

本次new的对象是子类的有参构造,父类和子类构造块仍然都执行了。子类的有参构造也执行了,而父类的有参构造没有执行,是因为子类中的构造方法前有一句super(),默认继承的是父类的无参构造,所以会这样。若想执行父类有参构造,只需在子类有参构造中,加对应数量参数即可,super(B)。如下:

public class A {
	static {
		System.out.println("父亲静态块");
	}
	{
		System.out.println("父亲构造块");
	}

	public A() {
		System.out.println("父亲构造方法");
	}
	public A(String A) {
		System.out.println("父亲有参构造方法");
	}
	public static void main(String[] args) {
		new B("11");
	}
}

class B extends A {

//	public B() {
//		System.out.println("   子类构造方法");
//	}

	public B(String B) {
		super(B);
		System.out.println("   子类有参构造方法");
	}

	static {
		System.out.println("   子类静态块");
	}
	{
		System.out.println("   子类构造块");
	}

}

输出结果如下:

父亲静态块
   子类静态块
父亲构造块
父亲有参构造方法
   子类构造块
   子类有参构造方法

可以看到父类有参构造也执行了

 

你可能感兴趣的:(Java)