为什么只有Java中的静态内部类具有静态成员?

时间:2011-12-20 00:00:20

标签: java

  

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

让我们看看Java中的以下代码片段。它只是在Inner类中声明的Outer类中总结了两个数字,并按预期正常工作。

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关键字时,它会发出编译时错误,指示内部类不能有静态声明表示静态字段(如果它是非静态的,则在Inner类中声明的x和y不起作用。


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

3 个答案:

答案 0 :(得分:0)

  

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

内部类属于out类的一个实例,所以它是有意义的。

答案 1 :(得分:0)

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

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

答案 2 :(得分:0)

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

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

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

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

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