Java中调用构造器初始化执行顺序

调用构造器初始化执行顺序:

  • 第一步:静态初始化语句、静态初始化块 按顺序依次执行。
  • 第二步:非静态初始化语句、非静态初始化块 按顺序依次执行。
  • 第三步:执行构造器方法。

注意:要是在加载静态部分时,通过new调用构造器,将会先暂停加载后面的静态部分,而去执行实例化。

静态部分只有在类第一次加载的时候,才会执行。之后再加载将不再执行。


示例:

public class Test1 {

    public static int k = 0;
    public static Test1 t1 = new Test1("t1");
    public static Test1 t2 = new Test1("t2");
    public static int i = print("i");
    public static int n = 99;
    public int j = print("j");

    {
        print("构造块");
    }

    static{
        print("静态块");
    }

    public Test1(String str){
    	System.out.print("Test1:");
        System.out.println((++k)+":"+str+"    i="+i+"    n="+n);
        ++i;++n;
    }

    public static int print(String str){
    	System.out.print("print:");
        System.out.println((++k)+":"+str+"    i="+i+"    n="+n);
        ++n;
        return ++i;
    }

    public static void main(String[] args) {
        Test1 t = new Test1("init");
    }
}

上例执行结果:

print:1:j    i=0    n=0
print:2:构造块    i=1    n=1
Test1:3:t1    i=2    n=2
print:4:j    i=3    n=3
print:5:构造块    i=4    n=4
Test1:6:t2    i=5    n=5
print:7:i    i=6    n=6
print:8:静态块    i=7    n=99
print:9:j    i=8    n=100
print:10:构造块    i=9    n=101
Test1:11:init    i=10    n=102

示例分析:

1.在main函数中,创建一个Test1的对象,通过new Test1("init");调用Test1(String str)构造器方法对该对象进行初始化。因为这是第一次加载Test1类,所以将会先加载静态部分。

2.开始加载静态部分,先是静态初始化语句,第一句静态初始化语句public static int k = 0;此时静态变量k为0

3.下一句静态初始化语句public static Test1 t1 = new Test1("t1");由于该句又对Test1类进行实例化,此时就是上文中注意部分所提到的,在加载静态部分时又创建一个对象,所以此时将不会接着向下加载静态部分,而是进行第二次实例化。此次实例化将不再加载静态部分,而是直接按顺序去执行非静态部分。

4.执行第一句非静态初始化语句 public int j = print("j");,此时执行静态print方法,并传入参数 “j”,将打印出print:1:j i=0 n=0,因为执行++k所以k值为1,由于 i 和 n 未被初始化赋值,只是声明,所以此时 i 和 n 将被赋以默认值0。在打印后,通过++n; return ++i;分别将 n 和 i 加一,此时静态变量 i为1,n为1

5.继续往下执行非静态部分,{print("构造块"); },再次执行print方法,并传入参数 “构造块”,将打印print:2:构造块 i=1 n=1,之后,静态变量n 和 i 分别加一,i为2,n为2

6.接下来,继续向下执行非静态部分,发现后面没有非静态部分,最后将执行构造器方法Test1(String str),打印出Test1:3:t1 i=2 n=2,调用该构造器方法的语句 public static Test1 t1 = new Test1("t1");传入参数“t1”,之后++i;++n;又分别将 i 和 n 加一,i为3,n为3。此时这一次实例化完成。

7.接着继续向下执行静态语句public static Test1 t2 = new Test1("t2");此时将又一次进行实例化,再一次执行Test1类中的非静态部分和构造器,将依次打印print:4:j i=3 n=3print:5:构造块 i=4 n=4Test1:6:t2 i=5 n=5,此时i为6,n为6,分析过程见4,5,6。

8.接着继续向下执行静态语句public static int i = print("i");,执行print方法,传入参数“i”,将打印print:7:i i=6 n=6,之后 ++n; return ++i;分别将 i 和 n又加一,此时i为7,n为7

9.继续向下执行静态语句public static int n = 99;,将静态变量 n 赋值为99

10.继续向下执行静态部分,static{ print("静态块");}静态初始化块,将执行print方法,打印print:8:静态块 i=7 n=99,此时i为8,n为100

11.继续向下执行,此时还是在main方法中通过Test1 t = new Test1("init");实例化的过程,静态部分执行完,将执行非静态部分,public int j = print("j");,执行print方法,传入参数“j”,打印print:9:j i=8 n=100,此时i为9,n为101

12.继续向下执行非静态部分{print("构造块");},打印print:10:构造块 i=9 n=101,此时i为10,n为102

13.在静态部分、非静态部分执行后,最后执行构造器方法Test1(String str) ,调用该构造器的语句Test1 t = new Test1("init");传入参数“init”,打印Test1:11:init i=10 n=102,此时i为11,n为103

14.在以上过程中,每打印一次,由于++k,静态变量k先加一。

  • 1
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值