Dus*_*sty 7 java static final private
我最近遇到了一个声明了以下字段的类:
private final int period = 1000;
Run Code Online (Sandbox Code Playgroud)
在这个特殊的情况下,作者原本打算使它也是静态的,因为价值在任何时候都无法改变,没有真正的功能理由不宣布它是静态的,但它让我想知道Java如何对待最终vs最终的静态原语.
特别是:
1)最终的静态基元是如何存储的?它们是否只是直接编译成使用它们的表达式?
2)如果它们实际上是分配存储,那么包含类的每个实例是否必须维护对该位置的引用?(在这种情况下,对于小于4个字节的基元,该类的每个实例实际上都会比直接包含基元的情况更大,就像它在非静态情况下那样)
3)编译器现在是否足够智能,以确定在上述情况下,变量是"有效静态的",因为不可能让不同的实例包含不同的值,因此优化它与最终的静态值相似?
1)最终的静态基元是如何存储的?它们是否只是直接编译成使用它们的表达式?
不直接编译成表达式.它们被编译到.class文件中并由操作码引用ldc.
2)如果它们实际上是分配存储,那么包含类的每个实例是否必须维护对该位置的引用?(在这种情况下,对于小于4个字节的基元,该类的每个实例实际上都会比直接包含基元的情况更大,就像它在非静态情况下那样)
不,"引用"被烘焙到字节码中,因此不需要在每个实例的基础上存储任何内容.
3)编译器现在是否足够智能,以确定在上述情况下,变量是"有效静态的",因为不可能让不同的实例包含不同的值,因此优化它与最终的静态值相似?
不确定,但我怀疑它在编译器级别进行了优化.JIT可能会发挥作用.但是,我不确定你期待什么样的"性能差异".无论如何,性能影响都可以忽略不计.(静态/非静止/最终/非最终)