从一个例子来看java类的初始化过程

我从网上找了一下例子,然后把它放在idea里面debug,它的大体顺序是这样的

首先是类的静态方法,再是类的静态变量,然后是创建静态对象,创建静态对象的时候,首先是非静态的成员,(但是在这里它因为后面的静态变量还没初始化,所以创建静态对象的时候,它不对里面的非静态变量进行初始化),非静态语句块的执行,在加载时按代码的先后顺序进行,然后创建完静态对象之后,继续初始化后面的静态变量以及静态块,完成初始化静态变量以及静态代码块之后开始加载非静态成员/代码块,最后调用构造方法。

测试代码如下:

import java.util.*;

public class StaticTest {

    public static int k = 0;

    public static StaticTest t1 = new StaticTest("t1");

    public static StaticTest t2 = new StaticTest("t2");

    public static int i = print("i");

    public static int n = 99;

    public int j = print("j");

    {
        print("构造块");
    }

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

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

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

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

}

首先运行的是

public static int k = 0;

 然后是

public static StaticTest t1 = new StaticTest("t1");

在这里它会调用构造函数

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

在执行构造函数之前,它会先执行非静态成员以及代码块的调用。

 public int j = print("j");

 {
        print("构造块");
 }

因为这还是在类加载过程,所以 j 并不初始化,等到后面再初始化,然后调用print("j")方法

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

打印出:

1:j i=0 n=0

然后到构造块部分,同样的调用print(String str)方法,打印出:

2:构造块 i=1 n=1

运行完非静态成员和非静态代码块后,就执行构造方法,打印出:

3:t1 i=2 n=2

后面那个创建静态对象是一样的过程,就不过多描述了,分别打印出:

4:j i=3 n=3
5:构造块 i=4 n=4
6:t2 i=5 n=5

然后运行这一段代码:

 public static int i = print("i");

调用print(String str)方法,打印出:7:i i=6 n=6

接着运行以下代码:

 public static int n = 99;
 
static{
        print("静态块");
 }

先是初始化n=99,然后运行静态代码块里面的内容,打印出:8:静态块 i=7 n=99

然后调用main方法里面的:

StaticTest t = new StaticTest("init");

先是初始化非静态成员 j 以及运行非静态代码块

    public int j = print("j");

    {
        print("构造块");
    }

此时j被初始化成101,然后非晶态代码块里面打印:10:构造块 i=9 n=101

然后执行构造方法里面的内容,打印出:11:init i=10 n=102。到此结束。

一共打印出来的结果如下:

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

得到的静态成员变量的内容如下图

希望能帮助到大家,文章中如果有不对的地方,请指出来,谢谢大家。

猜你喜欢

转载自blog.csdn.net/a6822342/article/details/82950659
今日推荐