匿名内部类中是否允许定义静态变量?
匿名内部类中是否允许定义静态变量?
嗨,这个问题我之前也碰到过,其实是不同Java编译器的实现差异在搞鬼,咱们来掰扯清楚:
先看看你写的这段代码:
interface Workables { void Work(); } public class AnonymousTry { public static void main(String[] args) { Workables w = new Workables() { static int x = 10; public void Work() { System.out.println("Working..."+x); } }; w.Work(); } }
按照Java官方的语言规范,匿名内部类属于非静态内部类的一种,这类内部类里是不允许定义非final修饰的静态成员的。只有带final关键字的静态常量(也就是编译期就能确定值的静态变量),才是符合规范的写法。
那为什么你的代码在Eclipse里能正常跑呢?这是因为Eclipse用的是自家开发的ECJ编译器,它对Java规范做了一点扩展,允许匿名内部类里存在普通的静态变量;而绝大多数在线编译器用的是Oracle官方的javac编译器,它严格遵循Java规范,所以会直接报错,告诉你这种写法不合法。
如果想让你的代码在任何环境下都能正常编译运行,只需要把静态变量改成static final修饰的静态常量就行,比如:
interface Workables { void Work(); } public class AnonymousTry { public static void main(String[] args) { Workables w = new Workables() { static final int x = 10; // 加上final变成静态常量,符合规范 public void Work() { System.out.println("Working..."+x); } }; w.Work(); } }
这样不管是Eclipse还是在线编译器,都能顺利通过啦。
备注:内容来源于stack exchange,提问作者Bobby Brahmam
相关产品推荐
相关产品推荐

