博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
java 静态变量 静态代码块 加载顺序问题
阅读量:6081 次
发布时间:2019-06-20

本文共 1868 字,大约阅读时间需要 6 分钟。

在网上看了一个这样的题目

public class StaticTest {    public static void main(String[] args) {        staticFunction();    }    static StaticTest st = new StaticTest();    static {        System.out.println("1");    }    {        System.out.println("2");    }    StaticTest() {        System.out.println("3");        System.out.println("a=" + a + ",b=" + b);    }    public static void staticFunction() {        System.out.println("4");    }    int a = 110;    static int b = 112;}

问输出顺序是什么?

正确答案是:

23a=110,b=014

产生这个结果的原因的关键在这一句话: 

static StaticTest st = new StaticTest(); 
st变量的引用是本类的实例,因此在实例化st变量时,将实例初始化嵌入到静态初始化中。因为这一句放在静态初始化的开头,所以static int b=112没有被调用,输出的b=0,同时,输出1也在2和3后面。在对象的初始化时,也是先初始化环境变量,再执行构造函数,a的值为100。

后面我在想把static int b = 112放到st之前会发生什么

public class StaticTest {    public static void main(String[] args) {        staticFunction();    }    static int b = 112;    static StaticTest st = new StaticTest();    static {        System.out.println("1");    }    {        System.out.println("2");    }    StaticTest() {        System.out.println("3");        System.out.println("a=" + a + ",b=" + b);    }    public static void staticFunction() {        System.out.println("4");    }    int a = 110;}

执行结果:

23a=110,b=11214

b有值了。所以b在st声明前赋值,st实例化的时候b就有值了。说明静态变量之间实例化是按代码顺序执行的。

如果把静态代码块,提到st之前会发生什么呢?

public class StaticTest {    public static void main(String[] args) {        staticFunction();    }    static {        System.out.println("1");    }    static StaticTest st = new StaticTest();    {        System.out.println("2");    }    StaticTest() {        System.out.println("3");        System.out.println("a=" + a + ",b=" + b);    }    public static void staticFunction() {        System.out.println("4");    }    int a = 110;    static int b = 112;}

执行结果:

123a=110,b=04

发现执行顺序变了,它会先执行静态代码块,再执行st的实体化。

这边,我发现静态代码块与静态成员变量的初始化居然和代码顺序有关

所以不管是静态代码块还是静态成员变量,java都是哪个在前面先执行哪个。

转载地址:http://wjhgx.baihongyu.com/

你可能感兴趣的文章
批量删除redis key
查看>>
被嫌弃的eval和with
查看>>
人工智能抢饭碗,未来怎么养活家庭?
查看>>
Python学习(7)--if语句
查看>>
top命令
查看>>
php无限极分类
查看>>
mysql数据库入门、进阶和提升(续一)
查看>>
Windows网络连接指示器,NCSI
查看>>
Android——Shape详解
查看>>
高性能专业上网行为管理设备WSG-500E开箱评测
查看>>
Win10中启用Linux Bash
查看>>
读【深度探索C++对象模型】【下】
查看>>
互引头文件的一种解决策略
查看>>
http://blog.51cto.com/itsoul/2047041
查看>>
发明了互联网和AI的美军机构长文预测:人类正与机器合二为一
查看>>
rhel7 http实例
查看>>
PHP获取远程图片并调整图像大小(转)
查看>>
sysstat 安装
查看>>
大型网站运维管理特点介绍
查看>>
命令历史与别名
查看>>