我尝试声明一个类,如下所示classOuter{privatefinalclassInner{publicstaticfinalStrings1=newString("123");publicstaticfinalbyte[]bytes=newbyte[]{0x00,0x01};publicstaticfinalStrings2="123";publicstaticfinalbytebyte1=0x02;}}在上面的代码中,s1和bytes无法编译,但s2和byte1可以编译。如果我将整个常量声明放在外部类中,它就可以正常工作。我错过了什么。有帮助吗? 最佳
我有很多抽象类的子类,每个子类都声明了一个同名的publicstaticfinal字段。我在考虑在抽象父类(superclass)中有这个字段而不初始化它,并希望每个子类都被强制初始化它。我之所以想到这一点,是因为我的抽象类的所有子类都声明了一个名为UNIQUE_ID的公共(public)静态最终字符串字段,并且每个子类都必须声明一个具有完全相同名称的字段。我希望我的问题足够清楚,如果不是请告诉我。可以做一些或多或少等同于此的事情吗?编辑:添加代码:我的抽象类如下所示:publicabstractclassExperimentPanelModelextendsPanelizable{p
我对匿名类和最终字段的解释仍然不满意。有很多问题试图解释明显的问题,但我还没有找到所有问题的答案:-)假设如下代码:publicvoidmethod(finalinti,intj){finalintz=6;finalintx=j;intk=5;newRunnable(){publicvoidrun(){System.out.print(i);System.out.print(x);System.out.print(z);System.out.print(k);}};}由于“未最终的”k属性,无法编译此代码。我知道编译器可以在编译期间用声明的值替换z属性。当我搜索解决方案时,i和x究竟如
有没有办法强制Java中的类具有publicstaticfinal字段(通过接口(interface)或抽象类)?或者至少只是一个公共(public)领域?我需要以某种方式确保一组类有publicstaticfinalStringTYPE="...";在其中。 最佳答案 不,你不能。你只能强制他们有一个非静态的getter方法,它会为每个子类返回适当的值:publicabstractStringgetType();如果你需要将某物的每个子类映射到一个值,而不需要实例化它,你可以创建一个publicstaticMap,String>t
我目前正在阅读JoshuaBloch的《EffectiveJava》,第17条是“为继承设计和记录,否则禁止继承”。作者建议默认禁止继承。在默认情况下将类声明为final是否安全,如果需要扩展类,在以后的版本中删除final关键字是否安全?它会破坏对使用先前版本编译的代码的向后兼容性吗?如果是这样,似乎更安全的做法是将所有类设为最终类,并且仅在有良好支持需求的情况下在未来的版本中将其删除。 最佳答案 它既不破坏二进制也不破坏源兼容性。这就是将类(class)设置为final是个好主意的原因之一;改变主意总是可以的。TheJavaLa
我正在尝试将final关键字添加到IntelliJIDEA14中自动生成的setter中的参数。我知道我可以创建用于setter方法的当前模板的副本:#set($paramName=$helper.getParamName($field,$project))public###if($field.modifierStatic)static###endvoidset$StringUtil.capitalizeWithJavaBeanConvention($StringUtil.sanitizeJavaIdentifier($helper.getPropertyName($field,$pr
如果我查看OpenJDK、Hibernate或Apache中的java源代码,我还没有看到任何局部变量声明为final。这表明一些最广泛使用的Java软件库的开发人员:不要相信final关键字会提高可读性。不相信它会显着提高性能。为什么stackoverflow上的大多数贡献者都认为应该使用它(基于投票最高的回复)? 最佳答案 可能是因为输入单词final中的五个LONG字母很麻烦...为什么他们要经历写作的痛苦finalintx;打字次数是原来的两倍intx;?我们开发人员很懒,你知道的...:P
publicclassMain{staticfinalintalex=getc();staticfinalintalex1=Integer.parseInt("10");staticfinalintalex2=getc();publicstaticintgetc(){returnalex1;}publicstaticvoidmain(String[]args){finalMainm=newMain();System.out.println(alex+""+alex1+""+alex2);}}有人能告诉我为什么打印:01010吗?我知道它是一个静态最终变量,它的值不应该改变,但有点难以理
Thisquestionalreadyhasanswershere:Whydoeschangingthereturnedvariableinafinallyblocknotchangethereturnvalue?(7个答案)7年前关闭。我正在阅读此question,并且得到了以下代码片段:publicvoidtestFinally(){System.out.println(setOne().toString());}protectedStringBuildersetOne(){StringBuilderbuilder=newStringBuilder();try{builder.ap
考虑以下代码。为了防止IndexOutOfBoundsException打电话时listIterator,我们使用读取器锁来检索基于索引的iteartor,并在对stockCodes进行写操作时使用写入器锁.请注意,我们没有使用任何锁定机制来使用listIterator进行迭代,因为它来自CopyOnWriteArrayList.不需要锁定,因为ConcurrentModificationException不应被抛出。//stockCodesReaderLockisreaderlockfromjava.util.concurrent.locks.ReadWriteLock//stock