开发者社区> 问答> 正文

为什么java非静态内部类可以有static final的数据成员?

根据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";
    }
}

就可以编译通过,为什么呢?

展开
收起
蛮大人123 2016-03-04 18:31:50 3134 0
1 条回答
写回答
取消 提交回答
  • 我说我不帅他们就打我,还说我虚伪

    实际上非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来为上述限制松绑, 以提供更多的灵活性.

    2019-07-17 18:52:44
    赞同 展开评论 打赏
问答排行榜
最热
最新

相关电子书

更多
Spring Cloud Alibaba - 重新定义 Java Cloud-Native 立即下载
The Reactive Cloud Native Arch 立即下载
JAVA开发手册1.5.0 立即下载