Java 为什么可以';我在内部类中声明并初始化静态变量吗?

Java 为什么可以';我在内部类中声明并初始化静态变量吗?,java,class,static,final,nested-class,Java,Class,Static,Final,Nested Class,A级是外级。B类是A的内部类,C类是B的内部类 所有三个类都声明并初始化一个静态final变量 这是A类中的对象: static final Object x = new Object(); B类: static final Object x1 = new Object(); C类: static final Object x2 = new Object(); 问题是,类A中的变量可以很好地编译,但在B和C中,变量不能 错误消息: 该字段不能声明为静态;静态字段仅在中声明 静态和顶层类型

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

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

这是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类中的
字符串
int
没有收到错误

完整代码:

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;
     }
  }
}

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

所以,静态不能存在于实例中

但它们可以有编译时常量,请检查。您的
x
x1
x2
不是编译时常量,而
s1
s2
y1
y2
是编译时常量

内部类不能声明静态初始值设定项(§8.7)或成员 接口,或发生编译时错误

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


您只需将内部类
设置为静态

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;
        }
    }
}

尽管这显然会使其他一些事情变得困难。

检查一下:当移除静态最终对象x2=新对象()时,它会起作用;语句程序也编译并运行,但当添加此语句时出现编译时错误检查我的更新应答我很好奇如何拥有一个隐式静态嵌套类…@fge:updated the answer但当删除这些类型语句时,static final Object x2=new Object();和程序编译,但也有静态字段int和intString@user3184306:检查我的更新答案,内部类可以有静态编译时常量