以下是来自有效Java:


  非静态成员类实例与其包围之间的关联
  创建前者时建立实例;它不能被修改
  之后。通常,通过调用
  非静态成员类构造函数的实例方法
  封闭类。尽管很少,但是可以手动建立关联
  使用表达式enclosingInstance.new MemberClass(args)。当你
  可以预期,该关联会占用非静态成员类中的空间
  实例,并增加了其构建时间。


Bloch在这里所说的是“尽管有可能,但可以使用表达式enclosingInstance.new MemberClass(args)手动建立关联。正如您所期望的,关联会占用非静态成员类实例中的空间并增加时间。它的构造。” ?

最佳答案

他表示您可以至少通过两种方式建立连接。给定

public class Outer {
    public class Inner {
    }
    void f() {System.out.println(new Inner());}
}
Outer x = new Outer();


如果你打电话

x.f()


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

但也可以调用:

x.new Inner();


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

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

查看live demo

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);
    }
}


输出:

I belong to x
I belong to y

10-07 17:18