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

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. 返回 字符串的 form和js组合让页面跳转

    router.get("/wy/jhy").handler(ctx->{ ctx.request().response().setChunked(true); System. ...

  2. trunk端口配置错误导致环路

    端口下 switchport mode trunk spannning-tree portfast 上述两个命令同时执行将导致环路

  3. PCIE training

    在PCIe链路可以正常工作之前,需要对PCIe链路进行链路训练,在这个过程中,就会用LTSSM状态机.LTSSM全称是Link Training and Status State Machine.这个 ...

  4. js计算日期相减天数

    代码: <!DOCTYPE html> <html> <head> <meta charset="utf-8"> </head ...

  5. Java多线程02(线程安全、线程同步、等待唤醒机制)

    Java多线程2(线程安全.线程同步.等待唤醒机制.单例设计模式) 1.线程安全 如果有多个线程在同时运行,而这些线程可能会同时运行这段代码.程序每次运行结果和单线程运行的结果是一样的,而且其他的变量 ...

  6. AD16 PCB重新定义板型时没有Redefine Board Shape

    1.高版本的AD都没有“Redefine Board Shape” 2.在Keep-Out-Layer层,做好了板子的外形,把外形都选中后,然后快捷键D-S-D即可.

  7. JS判断一个数组中有无重复元素(数字)

    前段时间遇到了这个问题 也百度了很多 不过还是用自己的方法解决了 一个超级简单的方法 简单到令人发指 由于直接写文本太丑了 所以还是截图吧 嘻嘻嘻 假如有一个这样的数组 (这是假如  可能每个人的数据 ...

  8. 自定义圆形ImageView(解决Bitmap bitmap = ((BitmapDrawable) drawable).getBitmap();报错问题)

    package com.bottle.bottlelilibrary.view; import android.content.Context; import android.graphics.Bit ...

  9. svn如何根据提交日志信息回退版本

    问题场景: 1 记得提交的日志信息中包含openssl,但是不记得这次提交的版本号revesion,是svn初始化后中间的某次提交: 2 svn环境的操作系统平台为Fedora, 即命令行下:而且sv ...

  10. Centos 安装 android sdk(转)

    原文地址: https://blog.csdn.net/kai_1215/article/details/80731099 这个后面有个指令没有运行起来,我做了一些修改: 原文:sdkmanager ...