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

Kew*_*ang 10 java static static-members inner-classes non-static

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

我知道创建一个非静态内部类对象需要一个外部类对象,而创建的非静态内部类对象自动拥有一个对外部类对象的隐藏引用.但为什么非静态内部类不能有静态成员呢?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() {
    };
}
Run Code Online (Sandbox Code Playgroud)

Kum*_*tra 15

1.一种objectNon-static inner class与相关联的instance/object其的Outer Class(即封闭类).

2.的整个身体 Non-static inner class不是一个静态的范围之内,因此,你不能有静态成员在那里.

3. Instance variablesmethodsnon-static inner class相对于所述封闭类的一个实例,因此被与对象相关的,静态就不会保持他们真实(即内部类),

4. 当我们创建Instance非静态的 inner class,我们需要Object of Outer enclosing class.所述non-static class具有隐式引用到它outer enclosing class.

例如:

Outer o = new Outer();
Outer.Inner i = o.new Inner();
Run Code Online (Sandbox Code Playgroud)

  • 关于第 2 点:内部类中允许使用静态编译时常量字段 (2认同)

Dur*_*dal 8

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

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

  • 正确的。没有技术限制,并且[已做出新的设计决策](https://bugs.openjdk.java.net/browse/JDK-8254321)。 (2认同)