Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/oop/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 从静态方法实例化非静态内部类_Java_Oop_Static - Fatal编程技术网

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

Java 从静态方法实例化非静态内部类,java,oop,static,Java,Oop,Static,我遇到了问题所描述的情况。 找到解决办法了但是!! 仍然无法理解为什么不能从静态方法实例化非静态内部类,但是可以,如果非静态类写在单独的文件中(即不作为内部类)它与InstanceInteger或静态方法中的任何其他类相同。作用域是本地的,因此是允许的。它与InstanceInteger或静态方法中的任何其他类相同。作用域是局部的,因此是允许的。内部类具有特殊的特性。其中一个是从甲骨文中摘取的 InnerClass的实例只能存在于OuterClass的实例中,并且可以直接访问其封闭实例的方法和字

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

它与InstanceInteger或静态方法中的任何其他类相同。作用域是本地的,因此是允许的。

它与InstanceInteger或静态方法中的任何其他类相同。作用域是局部的,因此是允许的。

内部类具有特殊的特性。其中一个是从甲骨文中摘取的

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


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

内部类具有特殊的特性。其中一个是从甲骨文中摘取的

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


静态嵌套类及其自身java文件中的类与内部类不依赖外部对象,因此您可以创建一个新类,而不需要封闭类的实例。

因为非静态内部类的实例包含对其所有者对象的引用(创建它的外部类的实例)。
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();
}

因为非静态内部类的实例包含对其所有者对象(创建它的外部类的实例)的引用。
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();
}