为什么非静态内部类不能有静态成员(字段和方法)? [重复](Why a non-static i

2019-06-26 14:18发布

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

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

Answer 1:

从技术上讲,我不知道有什么原因语言限制使用的内部类的静态元素。 非静态内部类可以通过使用一个普通的类,是以(前)包封实例作为参数传递给构造来仿真。 当然也有许多小的差异,当涉及到可视性规则的可见性范围。

我相信这是一个语言的设计决策,主要是因为在非静态内部类的静态的混乱和不直观的访问(Outer.Inner.StaticMember)。



Answer 2:

1,一种object一个的Non-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();


Answer 3:

没有一个非静态内部类的内部提供一个静态方法的点。 您可以使用外部类,而不是内部的非静态方法?



文章来源: Why a non-static inner-class cannot have static members (fields and methods)? [duplicate]