Java static和new对象的执行顺序

该文章通过一个示例展示了Java中类的静态块、实例代码块、构造方法的执行顺序。在静态初始化时,先执行父类的静态块,然后是子类的静态块;在创建对象时,先执行父类的实例代码块和构造方法,接着是子类的实例代码块和构造方法。每个类的静态初始化和对象创建都会独立按顺序执行。

ParentTon

public class Parent {
	
	public static final int P_A = 0;
	public static int P_B=0;
	public static int P_C;
	
	private static SingleChild obj = new SingleChild();
	
	Parent(){
		System.out.println("Parent_Constructor--level--3");
		P_B++;
		P_C++;
	}
	{
		System.out.println("Parent Code block--level--2");
	}
	static {
		System.out.println("Parent Static block--level--1");
	}
}

SingleChild 

public class SingleChild extends Parent{
    private static SingleChild obj = new SingleChild();
    public static int C_A;
    public static int C_B = 0;

    {
    	System.out.println("Child code block --level--4");
    }
    
    static {
    	System.out.println("Child static block --level--6");
    }
    
    public SingleChild() {
    	System.out.println("Child_Constructor--level--5");
        System.out.println(C_A); // 0
        System.out.println(C_B); // 0
        C_A++;
        C_B++;
    }

    public static SingleChild getInstance() {
        return obj;
    }
}

Test

public class TestClassExcuteChian {

    public static void main(String[] args) {
        System.out.println("C_A="+SingleChild.C_A);
        System.out.println("C_B="+SingleChild.C_B);
        SingleChild obj1 = SingleChild.getInstance();
        SingleChild obj2 = new SingleChild();    
        System.out.println("P_A="+SingleChild.P_A);
        System.out.println("P_B="+SingleChild.P_B);
        System.out.println("P_C="+SingleChild.P_C);
    }
}

Test result

Parent Code block--level--2

Parent_Constructor--level--3

Child code block --level--4

Child_Constructor--level--5

0

0

Parent Static block--level--1

Parent Code block--level--2

Parent_Constructor--level--3

Child code block --level--4

Child_Constructor--level--5

1

1

Child static block --level--6

C_A=2

C_B=0

Parent Code block--level--2

Parent_Constructor--level--3

Child code block --level--4

Child_Constructor--level--5

2

0

P_A=0

P_B=3

P_C=3

总结

父类的静态块 --   1, 如果在静态new A(),代码块和构造方法 ,不执行static部分

父类的代码块 --   2,new A(),同样会执行代码块,级别高于构造方法

父类的构造方法--3,new A() 和初始化时,都会执行

子类的静态块 --  4,

子类的代码块--   5

子类的构造方法--6

所有的静态初始化,和new(),会分别放到两个堆栈中执行,各自按照顺序执行。

评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值