当前位置: 首页 > 面试题库 >

Java 编译时常量和变量

督飞鸣
2023-03-14
问题内容

Java语言文档说:

如果将原始类型或字符串定义为常量,并且在编译时知道该值,则编译器会使用其值替换代码中各处的常量名称。这称为编译时常量。

我的理解是,如果我们有一段代码:

private final int x = 10;

然后,编译器会将x代码中每次出现的内容替换为literal 10。

但假设常量在运行时初始化:

private final int x = getX(); // here getX() returns an integer value at run-time.

与编译时常量相比,性能是否会下降(无论可以忽略不计)?

另一个问题是下面的代码行:

private int y = 10; // here y is not final

被编译器以与编译时常量相同的方式处理?

最后,我从答案中了解到的是:

  1. final static 表示编译时常数
  2. 只是final意味着它是一个常量,但是在运行时初始化
  3. 只是static意味着在运行时初始化
  4. 没有final是变量,不会被视为常量。

我的理解正确吗?


问题答案:

编译时间常数必须为:

  • declared final
  • primitive or String
  • initialized within declaration
  • initialized with constant expression

所以private final int x = getX();不是恒定的。

第二个问题private int y = 10;不是恒定的(在这种情况下是非最终的),因此优化程序无法确定该值将来不会更改。因此,它无法将其优化为恒定值。答案是:不,它与编译时间常数的处理方式不同。



 类似资料:
  • 问题内容: 考虑以下示例代码 它给出以下输出 方法调用将在运行时解决,并按预期调用正确的重写方法。 后来我了解到,变量访问是在编译时解决的。我期望输出为 因为在派生类中阴影的重新定义是在基类中的。 为什么变量的绑定在编译时而不是在运行时发生?这是仅出于性能原因吗? 问题答案: 原因在Java语言规范的15.11节中的示例中进行了说明,如下所示: … 最后一行表明,实际上,所访问的字段不依赖于所引用

  • 我试图创建一个编译时常量,这样R8就可以在最终的生产apk中省略调试代码。我遇到了一个路障,不可分配给。 进一步检查后,我发现用wrapper。 这里的问题是: 为什么不能将静态最终布尔值指定给常量值

  • Persistant compile identifier. As an alternative to passing the same compile_id to each and every function call, you can set this compile_id and it will be used implicitly thereafter. 永久的编译鉴别号.作为一个可选办

  • Specifies the name of the compiler class that Smarty will use to compile the templates. The default is 'Smarty_Compiler'. For advanced users only.指定Smarty用来编译模板的编译类名.默认为:'Smarty_Compiler'.仅适合于高级用户.

  • 问题内容: 以下文本来自jls http://docs.oracle.com/javase/specs/jls/se7/html/jls-17.html#jls-17.5.3 即使这样,仍然存在许多并发症。如果在字段声明中将final字段初始化为编译时常量表达式(第15.28节),则可能不会观察到对final字段的更改,因为在编译时会用常量表达式的值替换对final字段的使用。 有人可以给我更好的

  • 本文向大家介绍java中变量和常量详解,包括了java中变量和常量详解的使用技巧和注意事项,需要的朋友参考一下 变量和常量 在程序中存在大量的数据来代表程序的状态,其中有些数据在程序的运行过程中值会发生改变,有些数据在程序运行过程中值不能发生改变,这些数据在程序中分别被叫做变量和常量。 在实际的程序中,可以根据数据在程序运行中是否发生改变,来选择应该是使用变量代表还是常量代表。 变量 变量代表程序