静态代码块、非静待代码块、静态变量的执行次序

简介: 关于静态代码块、非静待代码块、静态变量的执行次序,大的问题相信大家都明白,但是最近有同学问到了如下问题,觉得难以理解其输出。其问题的代码如下: public class StaticTest {     public static void main(String[] args) {     ...

关于静态代码块、非静待代码块、静态变量的执行次序,大的问题相信大家都明白,但是最近有同学问到了如下问题,觉得难以理解其输出。其问题的代码如下:

public class StaticTest {

    public static void main(String[] args) {
        staticFunction();
    }

    static StaticTest st = new StaticTest();
    static {
        System.out.println("1");
    }
    {
        System.out.println("2");
    }

    public StaticTest() {
        System.out.println("3");
        System.out.println("a=" + a + " b=" + b);
    }

    private static void staticFunction() {
        System.out.println("4");
    }

    int a = 100;
    static int b = 112;

}

其输出为:

2
3
a=100 b=0
1
4

其实,任何问题碰到了,我们的首要任务是分解,就像上面这段代码,我们首先把这行代码注释掉:

//static StaticTest st = new StaticTest();

继而继续执行,输出为:

1
4

这个很好理解,如果类被用到,静态代码块会首先被执行,所以一般来说,静态代码块被用作与类变量(静态变量)的初始化。

接下来,我们先不分析上面的代码,先看一段其它的代码:

public class StaticTest {
    public static void main(String[] args) {
    }
    static Test01 test01 = new Test01();
}

class Test01{
    static int b = 112;
    public Test01(){
        System.out.println( "b=" + b);
    }
}

输出为多少,你一定会说,是:

b=112

完美,我们的理解没错,但是,仿佛最上面的代码就不对了,我们还原下最上面的代码:

public class StaticTest {
    public static void main(String[] args) {
    }
    public StaticTest(){
        System.out.println( "b=" + b);
    }
    static StaticTest test01 = new StaticTest();
    static int b = 112;
}

输出为:

b=0

我觉得如果这个时候我们还不能理解的话,我们稍稍改变下代码的位置:

static int b = 112;
static StaticTest test01 = new StaticTest();

输出结果为112;

所以把最开始的那段代码中b的定义移到st的上面一行,

static int b = 112;
static StaticTest st = new StaticTest();

输出就变为:

2
3
a=100 b=112
1
4

因为b和st都是静态变量,它们之间还有个先来后到的次序。

剩下的,应该都是很好理解的了。

Creative Commons License本文基于 Creative Commons Attribution 2.5 China Mainland License发布,欢迎转载,演绎或用于商业目的,但是必须保留本文的署名 http://www.cnblogs.com/luminji(包含链接)。如您有任何疑问或者授权方面的协商,请给我留言。
目录
相关文章
|
1月前
|
Java 编译器
不同变量的赋值时机 | 常见的面试题 | 静态代码块
这篇文章讨论了Java中不同变量的赋值时机,包括基本数据类型、引用数据类型、类变量、实例变量和局部变量,并解释了静态代码块、代码块和构造函数的执行顺序。
不同变量的赋值时机 | 常见的面试题 | 静态代码块
|
3月前
|
Java 编译器
Java中4种代码块:普通代码块,静态代码块,同步代码块,构造代码块
Java中4种代码块:普通代码块,静态代码块,同步代码块,构造代码块
43 0
实例详解局部代码块,构造代码块,静态代码块
实例详解局部代码块,构造代码块,静态代码块
|
Java
类成员(代码块)
类成员(代码块)
54 1
Java中类的初始化过程:(静态成员变量,静态代码块,普通成员变量,代码块初始化顺序)
Java中类的初始化过程:(静态成员变量,静态代码块,普通成员变量,代码块初始化顺序)
123 0
|
Java 编译器
复习篇【类的构造方法与代码块的执行】
复习篇【类的构造方法与代码块的执行】
复习篇【类的构造方法与代码块的执行】
|
Java 编译器
静态代码块、构造代码块、构造函数、普通代码块,还傻傻的分不清?(上)
哈喽,大家好,我是指北君。 在Java中,静态代码块、构造代码块、构造函数、普通代码块的执行顺序是一个笔试的考点,通过这篇文章希望大家能彻底了解它们之间的执行顺序。
静态代码块、构造代码块、构造函数、普通代码块,还傻傻的分不清?(上)
|
架构师 Java Spring
静态代码块、静态变量,构造代码块、实例变量的执行顺序和继承逻辑(下)
静态代码块、静态变量,构造代码块、实例变量的执行顺序和继承逻辑(下)
静态代码块、静态变量,构造代码块、实例变量的执行顺序和继承逻辑(下)
静态代码块、构造代码块、构造函数、普通代码块,还傻傻的分不清?(下)
哈喽,大家好,我是指北君。 在Java中,静态代码块、构造代码块、构造函数、普通代码块的执行顺序是一个笔试的考点,通过这篇文章希望大家能彻底了解它们之间的执行顺序。
静态代码块、构造代码块、构造函数、普通代码块,还傻傻的分不清?(下)