繁体   English   中英

这个Java程序总是只打印10但不打印SB。为什么?

[英]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.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM