根据java的语法,非静态内部类不可以有静态成员的声明,如
class Laptop {
// non-static inner class
class Battery {
private static String vendor = "Lenovo";
}
}
是不能编译通过的。
但是如果声明 Battery 的成员 vendor 为 final, 如:
class Laptop {
// non-static inner class
class Battery {
private static final String vendor = "Lenovo";
}
}
就可以编译通过,为什么呢?
实际上非static内部类里, static数据成员不是加了final的变量就可以了
比如:
import java.util.Date;
public class Outter {
class Inner{
int x;
final static int i=1;
final static Date t=new Date();
}
}
用jdk1.7的javac, 可以看到这个:
Outter.java:7: 错误: 内部类Outter.Inner中的静态声明非法
final static Date t=new Date();;
^
修饰符 'static' 仅允许在常量变量声明中使用
明显是不对的.
java在这上面有bug: https://bugs.eclipse.org/bugs/show_bug.cgi?id=343480 如果在新版的eclipse上, 可以看到: The field t cannot be declared static in a non-static inner type, unless initialized with a constant expression
不仅需要final, 还需要初始化为一个常量表达式.
最后补充一下我的理解, 为什么限制 非静态内部类不可以有静态成员的声明
如果我们不从抽象的语义方面去理解, 可以这么想:
public class Outter {
class Inner{
static Inner a1=new Inner();
}
}
如果上面的代码编译无误, 我们可以直接 Outter.Inner.a来拿到Inner类的实例, 而内部类的实例是一定要绑定到一个外部类的实例的. 然后java里试图用final来为上述限制松绑, 以提供更多的灵活性.
版权声明:本文内容由阿里云实名注册用户自发贡献,版权归原作者所有,阿里云开发者社区不拥有其著作权,亦不承担相应法律责任。具体规则请查看《阿里云开发者社区用户服务协议》和《阿里云开发者社区知识产权保护指引》。如果您发现本社区中有涉嫌抄袭的内容,填写侵权投诉表单进行举报,一经查实,本社区将立刻删除涉嫌侵权内容。