从静态方法实例化非静态内部类

时间:2016-01-15 14:33:06

标签: java oop static

我遇到this问题所描述的情况 得到了解决方案。
但是!! 仍然无法理解为什么不能从静态方法实例化非静态内部类,但是如果非静态类是在单独的文件中编写的(即不是作为内部类),则可以。

3 个答案:

答案 0 :(得分:2)

内部类具有特殊的特征。其中一个来自Oracle Java Tutorials

  

InnerClass的实例只能存在于OuterClass的实例中,并且可以直接访问其封闭实例的方法和字段。

自己的java文件中的静态嵌套类和类不像内部类那样依赖外部对象,所以你可以创建一个新的,而不需要封闭类的实例。

答案 1 :(得分:1)

因为非静态内部类的实例拥有对它的所有者对象(创建它的外部类的实例)的引用。 static方法没有关联的外部对象,因此它可以创建一个内部因为没有外部来提供它。

class Outer {
    Object somethingInTheOuterObject;

    class Inner {
        // Secretly holds a reference to its outer.

        void f() {
            // Can access my enclosing instance objects.
            Object o = somethingInTheOuterObject;
        }
    }
}

static void f() {
    // Cannot do this.
    new Outer.Inner();
    // Can do this.
    Outer outer = new Outer();
    // Can do this.
    Outer.Inner inner = outer.new Inner();
    // Can even do this.
    Outer.Inner inner1 = new Outer().new Inner();
}

答案 2 :(得分:0)

它与instanciate Integer或静态方法中的任何其他类相同。范围是本地的,因此是允许的。