除非使用常量表达式初始化,否则不能在非静态内部类型中声明static

时间:2016-05-29 12:28:45

标签: java

public class Test {

public enum Directions {
        NORTH, WEST, SOUTH, EAST
    }

    static final Directions D1 = Directions.NORTH;

    static class Inner {
        static final Directions D2 = Directions.NORTH;
    }

    class Inner2 {
        static final Directions D3 = Directions.NORTH;
    }

}

我正在获取标题中的IDE-Error,指的是变量D3。有人可以向我解释一下吗?为什么我不能在非静态的内部类中声明静态变量,为什么枚举值不是常量?

4 个答案:

答案 0 :(得分:3)

JLS §8.1.3 Inner Classes and Enclosing Instances

  

内部类可能不会声明静态成员,除非它们是常量   变量(§4.12.4)或发生编译时错误。

Why is an Enum entry not considered a constant variable?

  

基本类型或类型String的变量,即final和   用编译时常量表达式(第15.28节)初始化,是   称为常数变量。

答案 1 :(得分:1)

静态意味着它可以在没有任何实例的情况下使用。为了实例化非静态内部类的对象,需要外部类的实例。如果没有外部类的对象,则无法实例化非静态嵌套内部类。

class Inner2 {
    static final Directions D3 = Directions.NORTH;
}

Inner2不是静态的。在实例化之前,不能使用Inner2。因此,任何引用或方法只能在实例化后使用。由于Inner2不是静态的,所以D3的存在只有在我们有一个Inner2的对象并且被声明为静态时才有意义。

对于第二个问题,我有另一个相关的疑问,所以我更愿意添加我问过的问题的链接:Why compile time constants are allowed to be made static in non static inner classes?

希望一旦我们回答了这个问题,我们就会有更好的理解。

答案 2 :(得分:0)

移动课程

class Inner2 {
        static final Directions D3 = Directions.NORTH;
    }

在枚举器之外或者声明它也是静态的

答案 3 :(得分:0)

根据java documentation: 内部类可能不会声明静态初始化器(第8.7节)或成员接口,或者发生编译时错误。

内部类可能不会声明静态成员,除非它们是常量变量(第4.12.4节),否则会发生编译时错误。

enter image description here

enter image description here