当在一个方法中声明一个局部内部类时,为什么包含最终的静态字符串或it是合法的,而包含其他对象是不合法的?
例如:
class Outer {
void aMethod() {
class Inner {
final static String name = "compiles";
final static int ctr = 10; // compiles
final static Integer intThree = Integer.valueOf(3); // does not compile!
final static obj objConst = new Object(); // does not compile!
}
Inner inner = new Inner();
}
}
当我编译这段代码时,我得到了以下代码:
InnerExample.java:6: inner classes cannot have static declarations
final static Integer outer = Integer.valueOf(3);
^
InnerExample.java:7: inner classes cannot have static declarations
final static Object objConst = new Object();
^
为什么会有这样的区别?是因为字符串是不可变的吗?如果是这样,Integer.valueOf()不也是有效的吗?
发布于 2013-06-23 03:03:24
关于前一个答案的更多信息。赋值的值必须能被编译器证明它是一个常量。Java编译器知道基本类型(int、float等)的语义。和java.lang.String类,但不是其他类。这可以理解前两个例子的不变性。
编译器不知道Integer.valueOf(3)也是一个常量(实际上不是常量,但总是相同的)值,即使知道Integer类如何工作的人也知道这一点。编译器将其视为可以更改的Integer.valueOf(x)。如果Java提供一个注释,比如@interface Consistent,声明方法行为对于任何给定的参数都是稳定的,那就太好了,比如:
在整数类中:@Consistent public Integer valueOf(int x) {...}
最终静态整数intThree = Integer.valueOf(3);//现在编译!
这表明在给定相同的参数值的情况下,该方法在每次调用时返回相同或相等的对象。由于参数是常量表达式,编译器可以推断结果在所有用法中都是相同/相等的,因此可以将其视为常量。在这种情况下,Integer返回相同的对象,但它可以为更大的输入值返回不同(但相等)的对象(即。它缓存接近0的值)。
注意,"new“总是返回一个不同的对象。对于new Object(),它始终是一个不等于任何其他对象的对象。
https://stackoverflow.com/questions/17253979
复制相似问题