Java 内部类的创建依赖于有没有外部类的实例吗?

《Thinking in Java》里面第十章关于内部类的说法 193 页上写的是在拥有外部类对象之前是不可能创建内部类对象的。 而205页总结却写到…
关注者
30
被浏览
8,708

11 个回答

@彭晟杰

是对的。这是典型的“断章取义”,是要教坏小朋友的。

《Thinking in Java》P_{193} 的原话是这样的:

注意“但是”后面专门把“静态内部类”摘出来说明。所以,除了静态内部类之外,普通的内部类都是依附于一个外部类的对象实例。某种意义上,内部类也是相当于外部类的一个“成员”。虽然不是成员字段,也不是成员方法。

这也是为什么在P_{201} 作者说:普通内部类里不能有static成员,包括套嵌类

因为内部类相当于外部类的一个“成员”的地位,成员的静态字段何以自处?


第二条也是“断章取义”。原本是作为使用“内部类”的4条好处中的第三条提出来的。原文如下,

就像

@小酱油

说的,这里的重音在“时刻”两个字。作者想突出内部类是外部类“轻量级的可选组件”这个特性。其实也很好理解,比如迭代器(Iterator)作为很多容器的内部类,并不是在创建容器的时候就被一起创建的。而是要我们在需要它的时候,手动创建实例,提供容器内部元素的视图。突出“optional”的特性,而不是说它本身和外部容器没关系。

《Thinking in Java》中应该不会出现这种前后矛盾的低级错误,如果不是你没有结合上下文来看,那么一定是你打开的姿势不正确。

如果内部类被声明为静态的(Static),它的创建并不依赖于外部类的实例。