草庐IT

java - 为什么JDK源代码取 `final`实例的 `volatile`副本

我阅读了关于ConcurrentHashMap的JDK源代码。但是下面的代码让我很困惑:publicbooleanisEmpty(){finalSegment[]segments=this.segments;...}我的问题是:“this.segments”被声明:finalSegment[]segments;所以,在这里,在方法的开头,声明了一个相同类型的引用,指向相同的内存。作者为什么要这样写?他们为什么不直接使用this.segments呢?有什么原因吗? 最佳答案 这是涉及volatile变量的无锁代码的典型习语。在第一行,

java: "final"System.out、System.in 和 System.err?

System.out被声明为publicstaticfinalPrintStreamout。但是您可以调用System.setOut()重新分配它。嗯?如果是final,这怎么可能?(同一点适用于System.in和System.err)更重要的是,如果您可以改变公共(public)静态最终字段,那么就final给您的保证(如果有)而言,这意味着什么?(我从未意识到也不期望System.in/out/err表现为final变量) 最佳答案 JLS17.5.4WriteProtectedFields:Normally,finalsta

java: "final"System.out、System.in 和 System.err?

System.out被声明为publicstaticfinalPrintStreamout。但是您可以调用System.setOut()重新分配它。嗯?如果是final,这怎么可能?(同一点适用于System.in和System.err)更重要的是,如果您可以改变公共(public)静态最终字段,那么就final给您的保证(如果有)而言,这意味着什么?(我从未意识到也不期望System.in/out/err表现为final变量) 最佳答案 JLS17.5.4WriteProtectedFields:Normally,finalsta

java - 如何在屏幕上居中 JDialog?

如何将JDialog定位在屏幕中央? 最佳答案 在Java1.4+中你可以这样做:finalJDialogd=newJDialog();d.setSize(200,200);d.setLocationRelativeTo(null);d.setVisible(true);或者也许(1.4之前):finalJDialogd=newJDialog();d.setSize(200,200);finalToolkittoolkit=Toolkit.getDefaultToolkit();finalDimensionscreenSize=to

java - 如何在屏幕上居中 JDialog?

如何将JDialog定位在屏幕中央? 最佳答案 在Java1.4+中你可以这样做:finalJDialogd=newJDialog();d.setSize(200,200);d.setLocationRelativeTo(null);d.setVisible(true);或者也许(1.4之前):finalJDialogd=newJDialog();d.setSize(200,200);finalToolkittoolkit=Toolkit.getDefaultToolkit();finalDimensionscreenSize=to

java - 在构造函数中初始化一个静态最终字段

publicclassA{privatestaticfinalintx;publicA(){x=5;}}final表示变量只能被赋值一次(在构造函数中)。static表示它是一个类实例。我不明白为什么禁止这样做。这些关键字在哪里相互干扰? 最佳答案 每次创建类的实例时都会调用构造函数。因此,上面的代码意味着每次创建实例时都会重新初始化x的值。但是因为变量被声明为final(并且是静态的),所以你只能这样做classA{privatestaticfinalintx;static{x=5;}}但是,如果你删除静态,你可以这样做:clas

java - 在构造函数中初始化一个静态最终字段

publicclassA{privatestaticfinalintx;publicA(){x=5;}}final表示变量只能被赋值一次(在构造函数中)。static表示它是一个类实例。我不明白为什么禁止这样做。这些关键字在哪里相互干扰? 最佳答案 每次创建类的实例时都会调用构造函数。因此,上面的代码意味着每次创建实例时都会重新初始化x的值。但是因为变量被声明为final(并且是静态的),所以你只能这样做classA{privatestaticfinalintx;static{x=5;}}但是,如果你删除静态,你可以这样做:clas

java - 为什么可以修改最终对象?

我在正在处理的代码库中遇到了以下代码:publicfinalclassConfigurationService{privatestaticfinalConfigurationServiceINSTANCE=newConfigurationService();privateListproviders;privateConfigurationService(){providers=newArrayList();}publicstaticvoidaddProvider(ConfigurationProviderprovider){INSTANCE.providers.add(provider

java - 为什么可以修改最终对象?

我在正在处理的代码库中遇到了以下代码:publicfinalclassConfigurationService{privatestaticfinalConfigurationServiceINSTANCE=newConfigurationService();privateListproviders;privateConfigurationService(){providers=newArrayList();}publicstaticvoidaddProvider(ConfigurationProviderprovider){INSTANCE.providers.add(provider

java - 为什么接口(interface)中的所有字段都是隐式静态和最终的?

我只是想了解为什么接口(interface)中定义的所有字段都是隐含的static和final。保持字段static的想法对我来说很有意义,因为您不能拥有接口(interface)的对象,但为什么它们是final(隐式)?任何人都知道为什么Java设计人员会在接口(interface)中制作static和final中的字段吗? 最佳答案 接口(interface)旨在指定交互契约,而不是实现细节。开发人员应该能够通过查看接口(interface)来使用实现,而不必查看实现它的类。接口(interface)不允许您创建它的实例,因为您