黑马程序员技术交流社区

标题: 关于static静态代码块、静态成员变量执行顺序问题的初探 [打印本页]

作者: guyouzhong    时间: 2017-1-15 00:27
标题: 关于static静态代码块、静态成员变量执行顺序问题的初探
本帖最后由 guyouzhong 于 2017-1-15 00:37 编辑

今天在看单例设计模式的时候突然发现一个问题,突然在感慨真的很多小知识点都是这种小的发现,我们一步步去探索才能真正理解的,加油。

具体看代码:
[Java] 纯文本查看 复制代码
public class Intance01 {
        public static void main(String[] args) {
                Abs.getInstance();//获取实例
        }
}
/**@author tony*/
class Abs{
        private static Abs abs = new Abs();
        private static int a = 11;
        static{
                System.out.println("static===="+a+"===");
                a = 22;
        }
        {
                System.out.println("初始化===="+a+"===");
                a = 33;
        }
        private Abs(){
                System.out.println("构造===="+a+"===");
        }
        public static Abs getInstance(){
                return abs;
        }
}
运行结果为:
初始化====0===
构造====33===
static====11===

分析运行过程:
第一步:主函数中Abs.getInstance();执行时,Abs类需要加载;执行了private static Abs abs = new Abs();
第二步:运行初始化代码块,因为此时a还没有进行显式初始化所以输出 a = 0;
第三步:运行构造函数,输出a = 33;
第四步:运行private static int a = 11;,a 的显式初始化
第五步:静态代码块执行,输出结果为 a = 11;

----------------------------------------------------------
下面我将代码颠倒了一下顺序:
[Java] 纯文本查看 复制代码
 * 静态代码、静态变量遵循哪个在前面,哪个先加载个原则.
/** @author tony*/
class Abs{
        private static int a = 11;
        static{
                System.out.println("static===="+a+"===");
                a = 22;
        }
        {
                System.out.println("初始化===="+a+"===");
                a = 33;
        }
        private static Abs abs = new Abs();
        private Abs(){
                System.out.println("构造===="+a+"===");
        }
        public static Abs getInstance(){
                return abs;
        }
}

输出结果为:
   static====11===
   初始化====22===
   构造====33===

分析执行过程:
第一步:主函数中执行Abs.getInstance()时,Abs类需要加载,然后执行private static int a = 11;
第二步:静态代码块,输出结果为:a = 11;
第三步:private static Abs abs = new Abs();
第四步:执行构造代码块并输出a = 22;
第五步:执行构造函数,输出 a  = 33;

通过以上的两个案例的分析可以得出:类在加载的时候,静态代码、静态变量遵循哪个在前面,哪个先加载个原则.

作者: 烟雨清寒时    时间: 2017-1-15 00:37
加油

作者: guyouzhong    时间: 2017-1-15 00:39
烟雨清寒时 发表于 2017-1-15 00:37
加油

你这沙发抢的可以,也不评价一下,╮(╯▽╰)╭
作者: 烟雨清寒时    时间: 2017-1-15 00:41
guyouzhong 发表于 2017-1-15 00:39
你这沙发抢的可以,也不评价一下,╮(╯▽╰)╭

以后也就静态代码块见得多点。。。其他。。。我上完基础班到现在没遇见过,静态代码块还是看系统源码的时候见到的,自己从来没用过





欢迎光临 黑马程序员技术交流社区 (http://bbs.itheima.com/) 黑马程序员IT技术论坛 X3.2