Java程序执行

时间:2012-12-11 20:51:40

标签: java

请解释一下这个程序是如何表现的?

class A
{
    //public static String name = "asdf";

    public static final String name = "asdf";

    static {
        System.out.println("static block inside A");
    }

    {
        System.out.println("regular code block");
    }
}

public class tt 
{   
    public static void main(String ar[])
    {
        System.out.println(A.name);
        //A a = new A();
    }
}
  1. 执行上述程序时,输出为 - asdf
    Qns:为什么没有代码块没有被执行?

  2. 如果我取消注释非最终的静态变量名称和 注释最终的静态变量,我得到输出为 - 静态块在A 中                                 的 ASDF
    Qns:为什么常规代码块没有被执行?

  3. 如果我评论System.out.println(A.name);和 取消注释A a = new A();在课堂上 我得到输出为 - 静态块在A 中                                 常规代码块

    Qns:这两个块都在执行。     但静态块和。之间的区别是什么     常规区块?

1 个答案:

答案 0 :(得分:3)

  1. 由于name是一个static final String,其值为constant expression,因此tt.main的正文有效地编译为

    System.out.println("asdf");
    

    ...没有对A.name的引用的痕迹,因此A未初始化。

  2. “常规”代码块是实例初始化程序。它仅在您创建a实例时执行。

  3. 是的,此时您正在创建A的实例,因此static initializerinstance initializer都会运行。静态初始化程序只运行一次;每次创建实例时都会运行实例初始化程序。

  4. 按照上面的链接查看每个术语的Java语言规范详细信息。