You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

匿名内部类中是否允许定义静态变量?

匿名内部类中是否允许定义静态变量?

嗨,这个问题我之前也碰到过,其实是不同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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.04.14 11:13:06