[英]This Java Program is always printing only 10 but not printing SB.Why?
public class Test {
public static void main(String[] args) {
System.out.println(Hello.a1);
}
}
class Hello {
static final int a1=10;
static {
System.out.println("SB");
}
}
此代码始终打印10但不打印SB。为什么?
static final
字段实现为编译时常量,它在访问方法/类中复制,而不引用定义的上下文(其类)。 这就是访问它不会触发静态类块的原因。
这基本上是由于final
关键字。 如果你删除final
如下:
public class Test {
public static void main(String[] args) {
System.out.println(Hello.a1);
}
}
class Hello{
static int a1=10;
static{
System.out.println("SB");
}
}
您将看到SB
按预期打印。
您正在使用静态最终常量变量。 此变量将在编译时被实际常量值替换,以便提高性能。 如果您查看已编译的二进制代码(是的,您不能;)但从技术上讲是假设)它将类似于此:
public class Test {
public static void main(String[] args) {
System.out.println(10); // Constant
}
}
class Hello {
static final int a1=10;
static {
System.out.println("SB");
}
}
根据此代码,类Hello不会加载到RAM中。 因此它不会打印SB。
在创建类的实例时,将调用静态代码块。 试试这个:
public class Test {
public static void main(String[] args) {
Hello h = new Hello();
System.out.println(Hello.a1);
}
}
class Hello {
static final int a1 = 10;
static {
System.out.println("SB");
}
}
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.