Tag: final

如何在Java中完成最终字符串的连接?

当我编译这个片段。 public class InternTest { public static void main(String…strings ){ final String str1=”str”; final String str2=”ing”; String str= str1+str2; } } 其中产生以下字节代码 public static void main(java.lang.String…); flags: ACC_PUBLIC, ACC_STATIC, ACC_VARARGS Code: stack=1, locals=4, args_size=1 0: ldc #16 // String str 2: astore_1 3: ldc #18 // String ing 5: astore_2 6: ldc #20 // String […]

switch语句中的最终变量大小写

final int a = 1; final int b; b = 2; final int x = 0; switch (x) { case a:break; // ok case b:break; // compiler error: Constant expression required } /* COMPILER RESULT: constant expression required case b:break; ^ 1 error */ 为什么我会遇到这种错误? 如果我做了final int b = 2 ,一切正常。

为什么Java类既不是抽象的也不是最终的

假设我有一个只包含静态方法和变量的实用程序类。 例如: public abstract final class StringUtils { public static final String NEW_LINE = System.getProperty(“line.separator”); public static boolean isNotNullOrSpace(final String string) { return !(string == null || string.length() < 1 || string.trim().length() < 1); } } 在这种情况下,使类既抽象又最终是有意义的。 摘要因为制作这个类的对象没有用,因为所有方法都可以静态访问。 最后因为派生类不能从该类inheritance任何内容,因为它没有任何非静态成员。 C#允许这些类的静态修饰符。 为什么Java不支持这个?

Java – 最终变量

我知道,一旦最终变量赋值给它,就无法更改。 但是我对此有几个问题: 当我有一个字段时,说static final JButton button; 在一个类之外,然后在main方法中,尝试为它赋值, button = new JButton(“OK”); ,我收到错误告诉我删除最终修饰符? 但是,由于原始button变量尚未引用一个对象,我的印象是我可以分配一次? 其次,如果我完全删除对button引用,那么我只有static final JButton button; 在课堂外,我的IDE声称“空白的最终字段按钮可能尚未初始化”。 这是否意味着必须初始化所有最终字段? 如果是这样,他们必须在那里初始化,然后我似乎无法在以后初始化它。 另外,愚蠢的问题,但我最初的假设是,当一个实例或数据类型引用最终变量时,它无法分配给其他任何东西是正确的,对吗? 此代码不完整,但提供说明我的观点: public class FinalVarTester { static final JButton button; public static void main(String[] args) { JFrame frame = new JFrame(); Container container = frame.getContentPane(); container.setLayout(new BorderLayout()); button = new JButton(“OK”); container.add(button, BorderLayout.SOUTH); } }

字符串和最终

以下陈述之间有什么区别 String name = “Tiger”; final String name =”Tiger”; 虽然String类是final类,但为什么我们需要创建一个String“CONSTANT”变量作为final?

Java中的最终静态变量是否安全?

我已经阅读了很多,但没有找到明确的答案。 我有一个看起来像这样的课程: public class Foo() { private static final HashMap sharedData; private final HashMap myRefOfInnerHashMap; static { // time-consuming initialization of sharedData final HashMap innerMap = new HashMap; innerMap.put… innerMap.put… …a sharedData.put(someKey, java.util.Collections.unmodifiableMap(innerMap)); } public Foo(String key) { this.myRefOfInnerHashMap = sharedData.get(key); } public void doSomethingUseful() { // iterate over copy for (Map.Entry entry : this.myRefOfInnerHashMap.entrySet()) […]

关于在对象的构造函数完成之前对对象的引用

你们每个人都知道JMM的这个特性,有时候对象的引用可以在这个对象的构造函数完成之前获得值。 在JLS7中,p。 17.5 最后的字段语义我们也可以阅读: final字段的用法模型很简单:在该对象的构造函数中设置对象的final字段; 并且在对象的构造函数完成之前,不要在另一个线程可以看到的地方写入对正在构造的对象的引用 。 如果遵循此操作,那么当另一个线程看到该对象时,该线程将始终看到该对象的final字段的正确构造版本。 (1) 在JLS之后,接下来的例子展示了如何不保证非最终字段的初始化(1例17.5-1.1) (2) : class FinalFieldExample { final int x; int y; static FinalFieldExample f; public FinalFieldExample() { x = 3; y = 4; } static void writer() { f = new FinalFieldExample(); } static void reader() { if (f != null) { int i = fx; […]

在JButton内部执行的最终变量是否需要?

所以我有一个JList ,我试图在JButton的actionPerformed方法中使用它,它要求我让JList final为什么是这样,下面是一个代码片段 public SomeClass() { btnNewButton.addActionListener(new ActionListener() { public void actionPerformed(ActionEvent e) { list.clearSelection(); }}); } 我实际上没有问题让它成为最终的,我只是不确定为什么我需要。

如何在Java中扩展最终类

这是我现在面临的问题。 我有一个类,让我们说Foo ,这个类定义了一个名为getBar的方法,它返回一个Bar实例。 类Bar在Foo定义,并且被声明为public static final 。 我想要做的是定义一个扩展Foo的类MyFoo ,但我也希望通过添加我自己的function(方法,属性等)来扩展Bar与MyBar 。 我也想让getBar返回MyBar 。 问题是Bar是最终的。 以下是我想要做的事情的说明: public class Foo { Bar bar = new Bar(); public Bar getBar(){ return bar; } …. public static final class Bar { } } 我想做的是: public class MyFoo extends Foo { public MyBar getBar(){ // here I want to return an […]

使用相同的字符串文字而不是最终变量?

我遇到过一个包含字符串文字“foo”的多种用法的类。 我想知道的是,使用这种方法有什么好处和影响(在对象创建,内存使用和速度方面),而不是将String声明为final并用最终变量替换所有文字? 例如(虽然显然不是真正的单词用法): private static final String FINAL_STRING = “foo”; public void stringPrinter(){ for(int i=0;i<10;i++){ System.out.println(FINAL_STRING); } } 与: public void stringPrinter(){ for(int i=0;i<10;i++){ System.out.println("foo"); } } 哪个更好,为什么(假设字符串值保持不变)? 上面的(第二个)示例是否会导致创建10个String对象,或者JVM是否会意识到实际只使用了一个文字,并创建了一个引用。 如果是这样,将String声明为final是否有任何优势(如第一个例子中所示)? 如果解释的代码确实用单个引用替换字符串文字,那么如果相同的文字出现在多个位置,那么它是否仍然适用: public void stringPrinter(){ for(int i=0;i<5;i++){ System.out.println("foo"); // first occurence System.out.println("foo"); // second occurence } }