我很好奇JVM如何处理staticfinal字段。我看到一个类似的问题here但这不是我要找的。让我们考虑这样的例子:publicclassTestClassX{publicfinalintCODE_A=132;publicfinalintCODE_B=948;publicfinalintCODE_C=288;//someothercode}publicclassTestClassY{publicstaticfinalintCODE_A=132;publicstaticfinalintCODE_B=948;publicstaticfinalintCODE_C=288;//someoth
class文件格式是否支持final关键字以防与变量一起使用?或者它只是从代码中推断出变量的有效终结性,然后JIT编译器基于它执行优化?Here,在类文件格式文档中,他们提到了final关键字,但仅限于将它与finalblock和finalclass一起使用的情况。没有关于最终变量的内容。 最佳答案 不,类文件中没有编码的此类信息。您可以通过使用final局部变量和不使用final编译源文件来轻松验证这一点-结果类将是相同的。但是,Java8添加了MethodParameters记录有关方法参数的名称和访问标志的信息的属性。这意味着
以下代码有时会在我的WindowsPC和Mac上打印“valueWrapper.isZero()”,都在服务器模式下运行他们的JVM。好的,这是因为值字段在ValueWrapper类中不是最终的,所以有可能某个线程看到了陈旧的值0。publicclassConcurrencyApp{privatefinalRandomrand=newRandom(System.currentTimeMillis());privateValueWrappervalueWrapper;privatestaticclassValueWrapper{privateintvalue;publicValueWra
现在我正在创建大量类来保存我的配置,仅此而已。我所做的只是存储配置文件中的值。一半以上的代码是getter,我想知道现在的做法是仍然使用getter还是直接访问变量。所以这样:publicmyClass{publicmyClass(Stringname){this.name=name;}finalStringname;publicfinalStringgetName(){returnname;}}或者:publicmyClass{publicmyClass(Stringname){this.name=name;}publicfinalStringname;}让所有的getter都在
我知道接口(interface)中的所有字段都是隐式的staticandfinal.这在Java8之前是有意义的。但是随着默认方法的引入,接口(interface)也具备了抽象类的所有能力。因此,非静态和非最终字段也是必需的。但是当我尝试正常声明一个字段时,它默认变成静态和最终的。有没有办法在Java8的接口(interface)中声明非静态和非最终字段。还是我完全误解了这里的内容??? 最佳答案 Java接口(interface)中的所有字段都是publicstaticfinal。即使在添加了默认方法之后,在接口(interfac
考虑来自官方OpenJDKsource的这段代码java.awt.font.TextLayout的:publicfinalclassTextLayout{/*...*/protectedvoidhandleJustify(floatjustificationWidth){//nevercalled}}这里的用例是什么?为什么通常编写这样的代码可能有意义? 最佳答案 protected成员仍然可以通过同一包中的代码访问。我的猜测是这个类在一些早期的(可能甚至不是公共(public)的)版本中曾经是非最终的,然后变成了最终的,并且pro
我想设计一个类来逐步证明不变性。下面是一个简单的类publicclassImmutableWithoutMutator{privatefinalStringfirstName;privatefinalStringlastName;privatefinalintage;publicImmutableWithoutMutator(finalStringfirstName,finalStringlastName,finalintage){this.firstName=firstName;this.lastName=lastName;this.age=age;}@OverridepublicS
JLS2.13.1接口(interface)修饰符Aninterfacecannotbefinal,becausetheimplementationofsuchaclasscouldneverbecompleted.如果我可以在接口(interface)中编写创建静态内部类,我可以在其中提供实现,那么为什么会有这样的限制interfaceType{//NormalclassValue{privateValue(){}publicvoidprint(){System.out.println("Test");}}publicfinalValuevalue=newValue();}
我得到这个作为面试问题。whyisn'tThreadclassfinal?WhywouldyouextendaThreadever?我想不出真实世界的用例。 最佳答案 来自Oracle'sdocumentation:Therearetwowaystocreateanewthreadofexecution.OneistodeclareaclasstobeasubclassofThread.ThissubclassshouldoverridetherunmethodofclassThread.Theotherwaytocreateath
第二行的意义:publicfinalclassA{}finalAobj1=newA();如果A已经是不可变的,为什么人们可能想要使obj1成为最终的?(只是为了让它坚持一个独特的内存引用?)。 最佳答案 第一行中的final表示该对象因扩展而关闭......即你不能继承它。第二行的final表示您不能重新分配变量。 关于java-为什么将对最终类实例的引用声明为最终的?,我们在StackOverflow上找到一个类似的问题: https://stackover