-3

请解释一下这个程序的行为如何?

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(); 在 tt 类中,我得到的输出为 - 常规代码块内的静态块 Qns:这里两个块都在执行。但是静态块和常规块有什么区别?


4

1 回答 1

3
  1. 因为nameis astatic final String用一个常量表达式作为它的值,所以它的主体tt.main被有效地编译为

    System.out.println("asdf");
    

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

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

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

按照上面的链接访问每个术语的 Java 语言规范详细信息。

于 2012-12-11T20:57:42.570 回答