一道面试题加深对类加载过程的理解

代码示例一:没有设置初始值的静态变量a

public class SpringbootApplication {
    //没有设置初始值的静态变量a
    static int a;

    public static void main(String[] args) {
        System.out.println(a);
    }
}

运行结果:
在这里插入图片描述
这里能正常运行是因为,静态变量a在类加载的准备阶段会被做默认赋值,所以a会被默认设置为0,然后再经过初始化阶段被赋值成真正的值,由于这里没有做具体赋值,所以输出0。

代码示例二:设置了初始值的静态变量a

public class SpringbootApplication {
    //设置了初始值的静态变量a
    static int a = 1;

    public static void main(String[] args) {
        System.out.println(a);
    }
}

运行结果:
在这里插入图片描述
这里输出赋值的结果1。

示例代码三:没有赋初始值的静态常量

public class SpringbootApplication {
    //没有赋初始值的静态常量
    static final int a;

    public static void main(String[] args) {
        System.out.println(a);
    }
}

编译报错:
在这里插入图片描述
这里编译阶段就直接报错了,如果从逻辑上说,既然是常量,不能被修改,那肯定得给一个初始值,不然哪叫常量,而从类加载的过程来说,静态常量和静态变量有所不同,静态常量在准备阶段就会被赋值成真正被设定的初始值,不会像静态变量一样,先在准备阶段设个默认值,然后到初始化阶段再初始化一次,所以静态常量默认就是要赋初始值的,因为没有默认值给它兜底。

示例代码三:赋了初始值的静态常量

public class SpringbootApplication {
    //赋了初始值的静态常量
    static final int a = 0;

    public static void main(String[] args) {
        System.out.println(a);
    }
}

运行结果:
在这里插入图片描述
设置了初始值后,就能够正常输出了。

原创文章 358 获赞 387 访问量 7万+

猜你喜欢

转载自blog.csdn.net/weixin_38106322/article/details/105529335