为什么非静态内部类不能有静态成员(字段和方法)?

时间:2012-07-27 09:14:30

标签: java static inner-classes static-members non-static

  

可能重复:
  Why cant we have static method in an inner class?

我知道创建非静态内部类对象需要一个外部类对象,而创建的非静态内部类对象自动拥有对外部类对象的隐藏引用。但为什么非静态内部类有静态成员呢? Java设计者只需要禁止在内部类的静态方法中访问非静态外部类字段,它会更有意义吗,非?

如果在内部类中使用静态成员没有意义,为什么内部类可以通过继承具有静态成员的类来继承静态成员?

我也读过这个post。如上所述:

  

内部类可以继承非编译时的静态成员   常数,即使他们可能不会声明它们。嵌套类   不是内部类可以按照自由声明静态成员   使用Java编程语言的通常规则。

这是惯例吗?

这是我的代码:

public class OuterClass {

    private int outerClassField;

    public void doSomethingOuterClass() {
        outerClassField = 1;
    }

    public static void doSomethingStaticOuterClass() {
        // outerClassField = 2; // Error: Because static method cannot access an specific object's field
    }

    public class InnerClass extends ClassWithStaticField {

        // Error: Why a non-static inner class cannot have static fields ?
        // public static int innerClassStaticField = 1;

        public void doSomethingInnerClass() {
            outerClassField = 3;
            staticField = 1;
        }

        // Error: Why a non-static inner class cannot have static methods ?
        // public static void doSomethingStaticInnerClass() {
        // outerClassField = 4;
        // }
    }

    public static void main(final String[] args) {
        // If it does not make sense to have static members in an inner class, why inner class can inherit statis members by inheriting a class who has static
        // members?
        OuterClass.InnerClass.staticField = 1;
        OuterClass.InnerClass.staticMethod();
    }
}

class ClassWithStaticField {
    public static int staticField;

    public static void staticMethod() {
    };
}

2 个答案:

答案 0 :(得分:15)

1。 object Non-static inner class与其instance/object的{​​{1}}相关联(即附上课程)。

2。 <{strong> Outer Class的整个主体不在静态范围内,因此您可以那里没有静态成员。

3。 Non-static inner classInstance variables中的methods 相对于封闭类的实例,因此相关对于一个对象,静态不适合他们(即内部类),

4. 当我们创建{{1>} 非静态 non-static inner class时,我们需要一个{{ 1}}。 内部 Instanceinner class有一个隐式引用

<强>例如

Object of Outer enclosing class

答案 1 :(得分:8)

从技术上讲,我不知道为什么语言限制内部类使用静态元素的任何原因。 可以使用普通类来模拟非静态内部类,该普通类将(以前)封闭的实例作为构造函数的参数。当然,在可见性规则和可见性范围方面存在许多细微差别。

我认为这是一个语言设计决策,主要是因为非静态内部类中的静态访问令人困惑且不直观(Outer.Inner.StaticMember)。