请解释一下这个程序是如何表现的?
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();
}
}
执行上述程序时,输出为 - asdf
Qns:为什么没有代码块没有被执行?
如果我取消注释非最终的静态变量名称和
注释最终的静态变量,我得到输出为 - 静态块在A 中
的 ASDF
Qns:为什么常规代码块没有被执行?
如果我评论System.out.println(A.name);和
取消注释A a = new A();在课堂上
我得到输出为 - 静态块在A 中
常规代码块
Qns:这两个块都在执行。
但静态块和。之间的区别是什么
常规区块?
答案 0 :(得分:3)
由于name
是一个static final String
,其值为constant expression,因此tt.main
的正文有效地编译为
System.out.println("asdf");
...没有对A.name
的引用的痕迹,因此A
未初始化。
“常规”代码块是实例初始化程序。它仅在您创建a
的实例时执行。
是的,此时您正在创建A
的实例,因此static initializer和instance initializer都会运行。静态初始化程序只运行一次;每次创建实例时都会运行实例初始化程序。
按照上面的链接查看每个术语的Java语言规范详细信息。