为什么我不能在内部类中声明和初始化静态变量?

时间:2014-03-10 10:30:45

标签: java class static final nested-class

A类是外部类。 B类是A的内部类,C类是B的内部类。

所有三个类都声明并初始化一个静态最终变量。

这是A类中的对象:

static final Object x = new Object();

B级:

static final Object x1 = new Object();

C班:

static final Object x2 = new Object();

问题是A类中的变量编译得很好,但是在B和C中变量没有。

错误讯息:

  

该字段不能声明为静态;静态字段仅在。中声明   静态和顶级类型

B和C类中的Stringint未收到错误。

完整代码:

class A {
  static final Object x = new Object();
  static final String s = "s1";
  static final int y = 1;

  class B {
    static final Object x1 = new Object();
    static final String s1 = "s1";
    static final int y1 = 1;

     class C {
      static final Object x2 = new Object();
      static final String s2 = "s1";
      static final int y2 = 1;
     }
  }
}

2 个答案:

答案 0 :(得分:2)

在常规内部类中不能有静态字段/方法,因为内部类只能用于外部类的实例。

因此,静态不能与实例一起存在。

但是他们可以有编译时间常数,请检查JLS 8.1.3。您xx1x2不是编译时常量,而s1s2y1y2是编译时间时间常数

  

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

     

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

答案 1 :(得分:-2)

您可以创建内部类static

static class A {

    static final Object x = new Object();
    static final String s = "s1";
    static final int y = 1;

    static class B {

        static final Object x1 = new Object();
        static final String s1 = "s1";
        static final int y1 = 1;

        static class C {

            static final Object x2 = new Object();
            static final String s2 = "s1";
            static final int y2 = 1;
        }
    }
}

虽然显然这会使其他事情变得困难。