java中初始化执行的顺序

1.类型一:

package com.dbzhang.order;

public class A {

	public A() {
		System.out.println("A的构造函数4");
	}
	{
		System.out.println("A的非静态初始化块3");
	}
	static {
		System.out.println("A的静态初始化块1");
	}
	/**
	 * @param args
	 */
	/*public static void main(String[] args) {
		new A();
		System.out.println("====================");
	}*/

}
package com.dbzhang.order;

public class B extends A{

	public B() {
		System.out.println("B的构造函数6");
	}
	{
		System.out.println("B的非静态初始化块5");
	}
	static {
		System.out.println("B的静态初始化块2");
	}
	/**
	 * @param args
	 */
	public static void main(String[] args) {
		new B();
		System.out.println("-----------------7");
		
	}

}

执行的结果:

A的静态初始化块1
B的静态初始化块2
A的非静态初始化块3
A的构造函数4
B的非静态初始化块5
B的构造函数6
-----------------7

汇总:

(1)静态块、非静态块、变量的执行顺序先于方法;

(2)静态块先于非静态块;

2.第二种方式:要结合上边A类的代码

package com.dbzhang.order;

public class B extends A{

	public B() {
		System.out.println("B的构造函数6");
	}
	{
		System.out.println("B的非静态初始化块5");
	}
	static {
		System.out.println("B的静态初始化块2");
	}
	/**
	 * @param args
	 */
	public static void main(String[] args) {
		new A();
		System.out.println("-----------------7");
		
	}

}

执行结果:

A的静态初始化块1
B的静态初始化块2
A的非静态初始化块3
A的构造函数4
-----------------7

汇总:

(1)构造函数只有在new 对象的时候才能调用;

3.第三种方式:重写父类中的main()方法:

package com.dbzhang.order;

public class A {

	public A() {
		System.out.println("A的构造函数4");
	}
	{
		System.out.println("A的非静态初始化块3");
	}
	static {
		System.out.println("A的静态初始化块1");
	}
	/**
	 * @param args
	 */
	public static void main(String[] args) {
		new A();
		System.out.println("====================");
	}

}
package com.dbzhang.order;

public class B extends A{

	public B() {
		System.out.println("B的构造函数6");
	}
	{
		System.out.println("B的非静态初始化块5");
	}
	static {
		System.out.println("B的静态初始化块2");
	}
	/**
	 * @param args
	 */
	public static void main(String[] args) {
		new A();
		System.out.println("-----------------7");
		
	}

}

执行结果:

A的静态初始化块1
B的静态初始化块2
A的非静态初始化块3
A的构造函数4
-----------------7

汇总:

(1)子类重写父类中的main方法,但是仍和上边的执行顺序一样;

二:关于赋值的问题:当一个int型变量经过如下赋值:显示初始化、静态初始化块、构造函数,最后去哪个值?

package com.dbzhang.order;

public class A {
	static {
		a = 3;
	}
	private static int a = 1;
	public A() {
		a = 2;
	}
	
	
	/**
	 * @param args
	 */
	public static void main(String[] args) {
		new A();
		System.out.println("===================="+a);
	}

}

输出结果:

当不new对象的时候

====================3

当new对象的时候是:

====================2

汇总:

(1)当new对象时才会调用构造函数;

(2)a的赋值经历过程:静态变量、在初始化块、构造函数



猜你喜欢

转载自blog.csdn.net/zdb292034/article/details/80720192