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

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;
}

问输出顺序是什么?

正确答案是:

2
3
a=110,b=0
1
4

产生这个结果的原因的关键在这一句话: 
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;
}

执行结果:

2
3
a=110,b=112
1
4

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;
}

执行结果:

1
2
3
a=110,b=0
4

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

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

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

java 静态变量 静态代码块 加载顺序问题的更多相关文章

  1. java中带继承类的加载顺序详解及实战

    一.背景: 在面试中,在java基础方面,类的加载顺序经常被问及,很多时候我们是搞不清楚到底类的加载顺序是怎么样的,那么今天我们就来看看带有继承的类的加载顺序到底是怎么一回事?在此记下也方便以后复习巩 ...

  2. java:构造方法:无参构造/有参构造 this static关键字 静态变量 静态方法 代码块 封装 静态常量。

    /*构造方法是一种特殊的方法,专门用于构造/实例化对象,形式:[修饰符] 类名(){ }构造方法根据是否有参数分为无参构造和有参构造*/public class Dog {               ...

  3. jsp页面中的代码执行加载顺序介绍

    1. java是在服务器端运行的代码,jsp在服务器的servlet里运行,而javascript和html都是在浏览器端运行的代码.所以加载执行顺序是是java>jsp>js. 2. j ...

  4. JavaEE初始化时静态代码块加载问题

    1.使用java.exe命令运行某个类的时java.exe Person2.创建一个类的对象时Person p=new Person();3.访问类中的静态成员变量(赋值/获取值)System.out ...

  5. java 中类初始化,构造方法,静态成员变量,静态块的加载顺序

    1.编译和运行概念要搞清:编译即javac的过程,负责将.java文件compile成.class文件,主要是类型.格式检查与编译成字节码文件,而加载是指java *的过程,将.class文件加载到内 ...

  6. Windows系统环境变量、JAVA环境变量配置以及JVM加载过程

    一:用户变量和系统变量的区别 右击我的电脑.属性.高级系统设置.环境变量. 对话框的上面为Administrator的用户变量,对话框的下面为系统变量.我们所说的环境变量一般指系统环境变量,对所有用户 ...

  7. Java代码执行顺序(静态变量,非静态变量,静态代码块,代码块,构造函数)加载顺序

    //据说这是一道阿里巴巴面试题,先以这道题为例分析下 public class Text { public static int k = 0; public static Text t1 = new ...

  8. DLL加载顺序

    最近碰到了一个问题,要引入一个第三方的SDK,但是SDK中使用的一些dll和我原本程序里面有些dll是同名的,而且本程序的dll和sdk的dll名称都不能修改. 解决这个问题,首先想到的就是多进程,这 ...

  9. java中静态变量,静态代码块,静态方法,实例变量,匿名代码块等的加载顺序

    转自:http://blog.csdn.net/mrzhoug/article/details/51581994 一.在Java中,使用”{}”括起来的代码称为代码块,代码块可以分为以下四种: 1.普 ...

随机推荐

  1. Find out where to contain the smartforms

    Go to table E071 and give smarforms name and it will give the transport req for that. Run SE03, choo ...

  2. java 得到项目路径

    JavaEXTTomcatJSPWeb 一 相对路径的获得  说明:相对路径(即不写明时候到底相对谁)均可通过以下方式获得(不论是一般的java项目还是web项目)  String relativel ...

  3. Python模拟接口登录

    参考地址:https://blog.csdn.net/rifengxxc/article/details/77414090 下面讲下关于python模拟登录实验,之前怎么调试也不行,我也是摸索了好久, ...

  4. 洛谷P3916||图的遍历||反向建图||链式前向星||dfs

    题目描述 给出 NN 个点, MM 条边的有向图,对于每个点 vv ,求 A(v)A(v) 表示从点 vv 出发,能到达的编号最大的点. 解题思路 看起来很简单的一道题, 但我依然调了一天,我还是太菜 ...

  5. oracle竖表转横表字段合并

    select * from( SELECT t.ID, ISTATUS, ITIMEOUT, IRESENDTIMEOUT, IRESENDFIXED, IAUTOUPGRADE, STRTERMPR ...

  6. 浅谈Java和PHP的异同

    编程范式: Java:纯面向对象的语言,有人说过:Java中一切皆对象!当然咯,人们都忘了Java的八种基本数据类型:int.double.boolean.byte.float.long.short. ...

  7. 4-1 requests库的安装

    1.  一切安装从简就行了直接打开cmd命令窗口输入 pip install requests  把复杂的问题简单化,我这个已经安装好了.会提示已经安装. 2.打开cmd 输入python 这个会提示 ...

  8. Python 3.6安装yaml时报"AttributeError: module 'pip' has no attribute 'main'"和“Non-zero exit code”错误

    1.Python 3.6安装yaml时一开始报AttributeError: module 'pip' has no attribute错误,根据网上提供的解决方法修改Pycharm安装目录D:\Pr ...

  9. 在centos7上配置jenkins

    在Linux(centos7)环境下配置jenkins,并用github作为仓库. 配置jenkins https://blog.csdn.net/wangfei0904306/article/det ...

  10. appium java 滑动(js滑动和swipe滑动)

    最近有一个页面的内容很多,有的元素需要滑动到底部才能看到,所以就研究一下滑动,下面是我学习到的两种滑动方式 一:用js滑动 用js滑动的思路是很简单,首先是先定位到这个元素,定位到之后不做任何操作,然 ...