首页
学习
活动
专区
工具
TVP
发布
社区首页 >问答首页 >方法局部类中的Java final静态声明

方法局部类中的Java final静态声明
EN

Stack Overflow用户
提问于 2013-06-23 02:25:27
回答 1查看 1.2K关注 0票数 16

当在一个方法中声明一个局部内部类时,为什么包含最终的静态字符串或it是合法的,而包含其他对象是不合法的?

例如:

代码语言:javascript
复制
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();
}
}

当我编译这段代码时,我得到了以下代码:

代码语言:javascript
复制
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()不也是有效的吗?

EN

回答 1

Stack Overflow用户

发布于 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(),它始终是一个不等于任何其他对象的对象。

票数 5
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/17253979

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档