理解在Java中创建非静态成员类,如Effective Java book中所述

时间:2012-07-19 08:16:48

标签: java effective-java

以下来自Effective Java:

  

非静态成员类实例与其封闭之间的关联   实例是在创建前者时建立的;它无法修改   其后。通常,通过调用a自动建立关联   非实现成员类构造函数,来自一个实例方法   附上课。尽管很少见,但可以手动建立关联   使用表达式enclosingInstance.new MemberClass(args)。就像你一样   可以预料,该协会会占用非静态成员班级的空间   实例并增加了它的构造时间。

Bloch在这里说的是“尽管很少见,但是可以使用表达式usingInstance.new MemberClass(args)手动建立关联。正如您所期望的那样,关联占用了非静态成员类实例中的空间,增加了施工时间。“ ?

1 个答案:

答案 0 :(得分:4)

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

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