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

可能的重复:
为什么我们不能在内部类中使用静态方法?

我知道创建非静态内部类对象需要一个外部类对象,并且创建的非静态内部类对象会自动对外部类的对象进行隐藏引用。但是,为什么非静态内部类不能具有静态成员呢?Java设计人员只需要禁止在内部类的静态方法内访问非静态外部类字段,这将更有意义,非?

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

我也读了这篇文章。如前所述:

内部类可以继承不是编译时常量的静态成员,即使它们可能不声明它们。不是内部类的嵌套类可以根据 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() {
    };
}

答案 1

1. a 的 a 与其的 an 相关联(即封闭类)。objectNon-static inner classinstance/objectOuter Class

2. 的整个主体不在静态范围内,因此不能在其中包含静态成员。Non-static inner class

3. 在 are 相对于封闭类的实例,因此与对象相关时,静态对于它们(即内部类)不成立,Instance variablesmethodsnon-static inner class

4. 当我们创建一个 非静态时,我们需要一个 .内部有一个隐式引用Instanceinner classObject of Outer enclosing classnon-static classouter enclosing class

例如:

Outer o = new Outer();
Outer.Inner i = o.new Inner();

答案 2

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

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


推荐