4
回答
不是说静态优于优于代码块执行,为什么结果和想的不一样啊,求大牛解答,谢谢
终于搞明白,存储TCO原来是这样算的>>>   

public class Main {
    public static void main(String[] args) {
         new C();
    }
}

 

public class C{
    static C c=new C();
    public C(){
        
    }
    {
        System.out.println("普通代码块");
    }
    static{
        System.out.println("静态代码块。");
    }
}

<无标签>
举报
笑笑虎Hello
发帖于2个月前 4回/142阅

不错, 静态代码块 优于 普通代码块的 执行。如果去掉 类 C 中 静态属性 c, 一切如期待的一样。

public class Main {
    public static void main(String[] args) {
         new C();
    }
}

class C{
 //   static C c=new C();
    public C(){
    	System.out.println("Constructor for C is in progress.");
    	}
    
    {
        System.out.println("普通代码块");
    }
    
    static{
        System.out.println("Static  block 静态代码块。");
    } 
}

输出是:

Static  block 静态代码块。
普通代码块
Constructor for C is in progress.

但是,类 C 中 静态属性 c 出现了。必须先解决这个任务。  在为这个静态属性创建引用 时 , 操作顺序为:

1.  要为静态属性  c 建立引用, 即创建 类 C 的对象 c.  必须首先直接调用 普通代码块,接着 执行构造方法

2. 然后,执行 静态代码块

3. 返回 一个引用 给 static C c

因此,此时 普通代码块被首先调用了

由于 类 C 被加载了,才 得以 执行 类 Main 主方法的 new C(); 其操作为:

1. 执行 普通代码块。

2. 调用 构造方法。

因此, 有了 static C c= new C() 之后, 才有了以下的 输出:

普通代码块
Constructor for C is in progress.
Static  block 静态代码块。
普通代码块
Constructor for C is in progress.

 

这里, 最先执行的是普通代码块。

--- 共有 1 条评论 ---
笑笑虎Hello正解,我也明白了,非常感谢 2个月前 回复

看概念太抽象,建议用eclipse,跟代码,f6,一行一行跟一下,会很直观的。。

--- 共有 1 条评论 ---
笑笑虎Hello要理解才行,而且这个不是debug一下就能明白的,debug能看到 他下一步运行到哪,但为什么这样运行还是得靠自己理解 2个月前 回复
顶部