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

导入的Java类中的公共静态最终变量

淳于星宇
2023-03-14
问题内容

我碰巧在工作场所遇到了Java代码。这是场景:有2个类- ClassAClassB

ClassA除了4个公共静态最终字符串值外,没有任何内容。它的目的是使用类似的值ClassA.variable(不要问我为什么,这不是我的代码)。

ClassB进口ClassA。我在其中编辑了字符串值ClassA并对其进行了编译。当我运行时,ClassB我可以看到它正在使用旧值-
而不是新值。我不得不重新编译ClassB以使其使用来自的新值ClassA!(我不得不重新编译其他导入的类ClassA!)

这是仅因为JDK 1.6还是我早就应该知道重新编译ClassB!开导我。:)


问题答案:

如果final来自类的变量的值ClassA恰好是编译时常量,则编译器可能使用ClassA而不是生成运行时引用将它们内联到类中。我认为,这就是您描述的情况。

例:

public class Flags {
    public static final int FOO = 1;
    public static final int BAR = 2;
}

public class Consumer {
    public static void main(String[] args) {
         System.out.println(Flags.FOO);
    }
}

在此示例中,编译器可能会将的值FOO合并到为生成的代码中,Consumer而不是生成等效的运行时参考。如果FOO以后更改的值,则必须重新编译Consumer才能使其使用新值。

这是一种优化,在编译程序的效率和速度方面具有一些优势。例如,内联值可以启用使用该值的表达式的进一步优化,例如:

int x = Flags.FOO * 10;

在此示例中,对值进行内联(在这里:1)使编译器可以注意到,乘法没有影响,并且可以一起省略。



 类似资料:
  • 问题内容: 给定下面的Java代码,您可以在Ruby类中最接近地表示这两个变量吗?而且,在Ruby中是否可以像Java中那样区分和变量? 问题答案: Ruby中确实没有等效的构造。 但是,您似乎犯了一个经典的移植错误:您有一种使用语言A 的 解决方案 ,然后尝试将其翻译为语言B,这时您真正应该做的就是找出 问题 ,然后找出解决方法使用语言B。 我不能完全确定您要从那个小的代码段中解决什么问题,但是

  • 问题内容: 我一直想知道Java中的单例。按照惯例,单例设置如下: 最近,我切换到使用以下内容: 由于没有空检查,因此它更短,更快捷,而且打字对我来说比打字好。有什么理由不能使第二种方法成为主流呢? 问题答案: 第一个版本在第一次实际需要时创建实例,而第二个版本(较短的版本)在初始化类后立即运行构造函数 类或接口类型T将在以下任何一种首次出现之前立即初始化: T是一个类,并创建T的实例。 T是一个

  • 问题内容: 将变量声明为的区别是什么 要么 如果我只希望变量是局部的,并且是常量(以后不能更改)? 谢谢 问题答案: 仅仅具有预期的效果。 声明static使其成为一个类变量,使其可以使用类名进行访问

  • 我有一个抽象类的许多子类,每个子类都声明了一个同名的公共静态final字段。我在考虑在抽象超类中包含这个字段,而不初始化它,并希望每个子类都能被强制初始化它。 我之所以这么想,是因为抽象类的所有子类都声明了一个名为UNIQUE_ID的公共静态最终字符串字段,并且每个子类都有必要声明一个具有该名称的字段。 我希望我的问题足够清楚,如果不清楚,请告诉我。 能不能做一些和这个差不多的事情? 编辑:添加代

  • 问题内容: 这段代码: 编译并按预期工作。看起来这与以下内容相同: Java接口中的常量的“公共静态最终”是否多余?Java 1.1、1.2、1.3、1.4,…,1.8是否适用于Java,或者在Java版本中已更改? 问题答案: 在Interface中声明的变量是隐式的。这就是JLS 9.3 所说的: 接口主体中的每个字段声明都是隐式的 public,static和final 。可以为此类字段多余

  • 问题内容: [已更新,对更改感到抱歉,但现在是真正的问题] 对于getCanonicalPath()方法中的异常,我无法在其中包括try-catch- loop。我试图通过方法来解决问题,然后在其中声明值。问题是它是最终版本,我无法更改。因此,如何将startingPath作为“ public staticfinal”。 问题答案: 这个名字很好。您忘记声明类型了。 解决这个问题,您当然会意识到如