Java 内部类的创建依赖于有没有外部类的实例吗?
关注者
30被浏览
8,70811 个回答
@彭晟杰
是对的。这是典型的“断章取义”,是要教坏小朋友的。
《Thinking in Java》P_{193} 的原话是这样的:
注意“但是”后面专门把“静态内部类”摘出来说明。所以,除了静态内部类之外,普通的内部类都是依附于一个外部类的对象实例。某种意义上,内部类也是相当于外部类的一个“成员”。虽然不是成员字段,也不是成员方法。
这也是为什么在P_{201} 作者说:普通内部类里不能有static成员,包括套嵌类:
因为内部类相当于外部类的一个“成员”的地位,成员的静态字段何以自处?
第二条也是“断章取义”。原本是作为使用“内部类”的4条好处中的第三条提出来的。原文如下,
就像
@小酱油说的,这里的重音在“时刻”两个字。作者想突出内部类是外部类“轻量级的可选组件”这个特性。其实也很好理解,比如迭代器(Iterator)作为很多容器的内部类,并不是在创建容器的时候就被一起创建的。而是要我们在需要它的时候,手动创建实例,提供容器内部元素的视图。突出“optional”的特性,而不是说它本身和外部容器没关系。
《Thinking in Java》中应该不会出现这种前后矛盾的低级错误,如果不是你没有结合上下文来看,那么一定是你打开的姿势不正确。
如果内部类被声明为静态的(Static),它的创建并不依赖于外部类的实例。