java 为什么内部类不能声明静态成员?

nuypyhwy  于 2023-05-21  发布在  Java
关注(0)|答案(6)|浏览(85)

Java教程说,由于内部类与封闭类的示例相关联,因此它(内部类)本身不能定义任何静态成员。
对我来说很有趣的是,为什么内部类不能声明静态成员,例如,一些private static字段,这个内部类的示例可能与同一内部类的其他示例共享?这只是Java中的一个实现,必须被认为是理所当然的还是别的什么?

piah890a

piah890a1#

基本上是一个武断的决定。没有理由不支持它,但也没有任何好的理由支持它。在外部类中声明静态字段。
此外,这句话可能并不完全正确:我相信你可以在内部类中声明一个静态serialVersionUID。
更新,听起来这在Java 16中是可能的。

0yycz8jy

0yycz8jy2#

因为Java语言规范是这样说的:
内部类是未显式或隐式声明为静态的嵌套类。内部类不能声明静态初始化器(§8.7)或成员接口。内部类不能声明静态成员,除非它们是编译时常量字段(§15.28)。
至于 * 为什么 * 这样指定,我不知道。我的猜测是,内部类被设计为小型助手类,其复杂性应该非常有限。

mutmk8jj

mutmk8jj3#

为什么内部类不能声明静态成员?
内部类包含在 外类。因此,在内部类中,不允许声明静态成员。另一方面,静态内部类包含在 外类。因此,只允许声明静态成员,而不允许声明示例成员。

cbjzeqam

cbjzeqam4#

从Java 17开始,非静态内部类 * 可以 * 声明静态成员。该成员用于整个类。哪个对象示例化它并不重要。下面是一个示例程序来演示这一点。

public class Demo {
   public static void main(String[] args) {
      Person fred = new Person("Fred");
      Person.Property p1 = fred.new Property("last name", "Flintstone");
      Person wilma = new Person("Wilma");
      Person.Property p2 = wilma.new Property("spouse", fred);
      System.out.println(p1);
      System.out.println(p2);
   }
}

class Person {
   private String name;
   public Person(String name) { this.name = name; }
   public class Property {
      private static int count; // Only since Java 17
      private String name;
      private Object value;
      public Property(String name, Object value) {
         count++;
         this.name = name; 
         this.value = value;
      }
      public String toString() { return "I am a property (one of " + count + ") of " + Person.this.name + " with name " + name + " and value " + value; }
   }
}

输出:

I am a property (one of 2) of Fred with name last name and value Flintstone
I am a property (one of 2) of Wilma with name spouse and value Person@4e25154f

点是one of 2。其中一个Property对象属于fred,另一个属于wilma。静态变量count并不关心。Person.Property类有一个静态count变量。

e4yzc0pl

e4yzc0pl5#

内部class不能声明static字段,除非它们是编译时常量。因此,如果将static字段声明为final,它将工作。

class Foo {
    class Test {
       final static int i = 10;
    }
}

将完美地编译和运行
static字段只能在static或顶级类型中声明。因此,(纯)static变量只能在staticclass中声明。

krugob8w

krugob8w6#

这将导致在内部类中拥有静态成员变量的利益冲突。一般来说,内部类在被示例化之前需要有外部类或封闭类的对象示例。静态成员变量表明,您甚至不需要该特定类(在本例中为内部类)的对象示例,但内部类依赖于该类,并且只能与外部类示例共存。你看到争论中利益冲突的地方了吗?但是,你可以通过将内部类声明为静态来在内部类中创建静态成员变量,这意味着内部类不再需要与外部类对象共存。

public class A {

   public static class B {

       private static JPanel myJPanel;

   }

}

相关问题