美文网首页
java 静态 new 对象

java 静态 new 对象

作者: 南土酱 | 来源:发表于2019-05-06 12:20 被阅读0次
    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;
    }
    console(控制台打印):
    2
    3
    a=110,b=0
    1
    4
    

    一般情况下:

    Java中赋值顺序:
    父类的静态变量赋值
    自身的静态变量赋值
    父类成员变量赋值和父类块赋值
    父类构造函数赋值
    自身成员变量赋值和自身块赋值
    自身构造函数赋值

    但有时候实例初始化不一定要在类初始化结束之后才开始初始化。
    类的生命周期是:加载->验证->准备->解析->初始化->使用->卸载。

    只有在准备阶段和初始化阶段才会涉及类变量的初始化和赋值,因此只针对这两个阶段进行分析;

    类的准备阶段需要做是为类变量分配内存并设置默认值,因此类变量st为null、b为0;

    需要注意的是如果类变量是final,编译时javac将会为value生成ConstantValue属性,在准备阶段虚拟机就会根据ConstantValue的设置将变量设置为指定的值。

    如果这里这么定义:static final int b=112,那么在准备阶段b的值就是112,而不再是0了。
    那么问题来了,此时静态初始化过程还没完成就要初始化实例部分了。是这样么?
    从人的角度是的。但从java的角度,一旦开始初始化静态部分,无论是否完成,后续都不会再重新触发静态初始化流程了。
    因此在实例化st变量时,实际上是把实例初始化嵌入到了静态初始化流程中,并且在楼主的问题中,
    嵌入到了静态初始化的起始位置。这就导致了实例初始化完全至于静态初始化之前。这也是导致a有值b没值的原因。```

    相关文章

      网友评论

          本文标题:java 静态 new 对象

          本文链接:https://www.haomeiwen.com/subject/ktaegqtx.html