12

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

我知道创建非静态内部类对象需要一个外部类对象,并且创建的非静态内部类对象自动具有对外部类对象的隐藏引用。但是为什么非静态内部类不能有静态成员呢?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() {
    };
}
4

3 回答 3

17

1.object a 的一个Non-static inner classinstance/object它的一个Outer Class(即封闭类)相关联。

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

3. Instance variables封闭类的实例methods相关non-static inner class,因此与对象相关,静态对它们(即内部类)不适用,

4. 当我们创建一个Instanceof non-static inner class时,我们需要一个Object of Outer enclosing class. 内部有一个对它的隐式引用。non-static classouter enclosing class

例如:

Outer o = new Outer();
Outer.Inner i = o.new Inner();
于 2012-07-27T09:57:42.947 回答
9

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

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

于 2012-07-27T11:11:35.240 回答
0

在非静态内部类中提供静态方法是没有意义的。您可以在外部类中使用非静态方法吗?

于 2012-07-27T09:24:56.293 回答