了解 Java 中非静态成员类的创建,如《Effective Java》一书中所述

Gee*_*eek 1 java effective-java

以下内容来自《Effective Java》:

非静态成员类实例与其封闭实例之间的关联是在创建前者时建立的;此后无法修改。通常,通过从封闭类的实例方法中调用非静态成员类构造函数来自动建立关联。尽管很少见,但可以使用表达式 enleadingInstance.new MemberClass(args) 手动建立关联。正如您所期望的,关联占用了非静态成员类实例中的空间并增加了其构造时间。

Bloch 在此所说的“虽然很少见,但可以使用表达式 enleadingInstance.new MemberClass(args) 手动建立关联。正如您所期望的,该关联会占用非静态成员类实例中的空间并增加时间它的建设。” ?

Ray*_*oal 5

他的意思是你至少可以通过两种方式建立联系。给定

public class Outer {
    public class Inner {
    }
    void f() {System.out.println(new Inner());}
}
Outer x = new Outer();
Run Code Online (Sandbox Code Playgroud)

如果你打电话

x.f()
Run Code Online (Sandbox Code Playgroud)

那么您打印的值是链接到的内部对象x

但也可以调用:

x.new Inner();
Run Code Online (Sandbox Code Playgroud)

创建一个链接到的新内部对象x

布洛赫说第二种方式很少见。我不知道为什么;我过去用过它。

观看现场演示

class Outer {
    String name;
    public Outer(String name) {
        this.name = name;
    }

    public class Inner {
        public String toString() {
            return "I belong to " + Outer.this.name;
        }
    }

    void f() {
        System.out.println(new Inner());
    }

    void g(Outer a) { 
        System.out.println(a.new Inner());
    }
}

class Main {
    public static void main(String[] args) {
        Outer x = new Outer("x");
        Outer y = new Outer("y");
        x.f();
        x.g(y);      
    }
}
Run Code Online (Sandbox Code Playgroud)

输出:

I belong to x
I belong to y
Run Code Online (Sandbox Code Playgroud)

  • 这种情况很少见,因为*通常*“Inner”实例将在“Outer”*内部*的某个地方创建,因此使用更简单的语法“new Inner()”来代替。这种情况更常见的原因是内部类通常与其内部实例“强绑定”,并且通常对其他对象不感兴趣。 (9认同)