【问题标题】:Why do only static inner classes in Java have static members? [duplicate]为什么Java中只有静态内部类才有静态成员? [复制]
【发布时间】:2011-12-20 00:00:19
【问题描述】:

可能重复:
Why does Java prohibit static fields in inner classes?

让我们看一下Java中的以下代码sn-p。它只是总结了在 Outer 类中声明的 Inner 类中的两个数字,并且可以正常工作。

package staticfields;

final class Outer
{
    final public static class Inner
    {
        private static int x;
        private static int y;

        public Inner(int x, int y)
        {
            Inner.x=x;
            Inner.y=y;
        }

        public void sum()
        {
            System.out.println(x+y);
        }
    }
}

final public class Main
{
    public static void main(String[] args)
    {
        new Outer.Inner(5, 10).sum();
    }
}

当我尝试从 Inner 类中删除 static 关键字时,它会发出一个编译时错误,指示 内部类不能有静态声明意味着静态字段(x 和y) 如果将其设为非静态,则在 Inner 类中声明的将不起作用。


为什么Java中只有静态内部类有静态成员而非静态内部类没有?

【问题讨论】:

  • @glowcoder :) 当您从内部类中删除 static 关键字并使其成为非静态类时会发出错误。你试过吗?
  • @Lion 是的,问题在于我在该目录中有另一个名为 Outer 的类,所以我将其称为 OuterTest,但仍在编译 Outer :) Whoopsie :)
  • Java 中没有静态内部类。根据定义,内部类是嵌套的,但不是静态的。您命名为 Inner 的类是静态嵌套类,不是“内部类”,当然也不是“静态内部类”。这使您的问题难以阅读,因为您指的是一个根本不是内部类的 Inner 类(这就是您的命名方式):)

标签: java


【解决方案1】:

内部类是不显式或隐式的嵌套类 声明为静态的。内部类不能声明静态初始化器 (§8.7)或成员接口。内部类不能声明静态 成员,除非它们是编译时常量字段”

Inner 类属于 out 类的一个实例,所以有意义。

【讨论】:

    【解决方案2】:

    因为“内部类不能有静态声明”。 :-)

    但是说真的,根据定义,内部类是非静态的。 您需要了解内部类和嵌套类(静态)之间的区别。

    【讨论】:

      【解决方案3】:

      首先,快速回顾一下为什么可以将内部类声明为静态:

      非静态内部类只能存在于其声明的父类的实例的上下文中。因此,如果您的类 Inner 是非静态的,那么它只能存在于 Outer 的特定实例中。 IE。 Inner 依赖于有一个 Outer 的实例,并且每个 Inner 的实例都“引用”了一个 Outer 的实例(在这里松散地使用这个词)。

      这允许非静态内部类引用 Outer 的非静态字段和方法,而无需显式使用对 Outer 的引用。

      为了告诉编译器和 JVM 这不是内部类的期望行为,您需要将内部类设为静态(因此它不再是“内部”类)。然后,这打破了内部类对外部类实例的依赖关系,并允许您声明“内部”(嵌套)类,就像它是任何其他常规 Java 类一样。

      现在,由于非静态内部类依赖于外部类的特定实例,因此该内部类具有非最终静态成员没有意义(因为修改一个有效地破坏了内部类的封装)。我相信如果他们愿意,他们可能在技术上允许它,但使用它可能是不好的编程习惯,并表明你真正想要的是一个静态嵌套类。

      【讨论】:

      猜你喜欢
      • 2023-03-06
      • 1970-01-01
      • 2013-07-26
      • 2013-07-27
      • 2015-08-15
      • 2016-08-20
      • 1970-01-01
      • 2016-07-13
      • 2011-11-10
      相关资源
      最近更新 更多