这一章,是Java基础理论最后一部分了。后面就是数组,容器,String,IO了。当然,后面的泛型也是理论占主要的。
内部类,有点难。难主要难在我们不常用,我们设计的时候,也很少会考虑设计一个内部类。应该是自己的道行还不到那个高度。 但是,我们平时阅读别人的代码的时候,经常会遇到内部类。所以,我感觉,这一章应该是读完后,可以顺利读懂别人的代码。体会别人设计内部类的优点。
内部类优点
《java编程思想4》190页,开始就提出了内部类的三个优势。
- 将类置于其他类的内部,实现代码隐藏。
- 它了解外围类,并且能与之通信。它甚至可以随意访问其外围类的private字段。
- 用内部类,有时可以让代码变的优雅清晰。
我们知道,一个Java文件,可以包含一个public类和0到多个默认访问权限的类。 为什么要有那些默认访问权限的类呢?为了代码隐藏,这些类不对外提供服务。仅仅是为了服务public类。但是,这种分类是非常粗糙的。它隐藏的不好,它的访问控制权限很粗糙。而内部类,就很细腻了。直接塞入一个普通类里面,你想怎么加访问权限就怎么加。可以有一个很好的访问权限控制(就是隐藏)。这就是内部类的第一个优势。
光有第一个优势,其实还不足以让内部类出现。 一个语言特性,Java专家其实是会看它是否需要,才会去是否支持的。除非有一些特性,是受Java先天影响,添加不上去的。否则,Java专家会尽量的把有用的语言特性都添加上去。为了让用Java的人用的舒服。内部类有第二个优势,它可以与外围类通信,无阻碍的随意的访问外围类的字段。我们对内部类的理解发生了倒转。原来以为,它在内部,我们是通过外围类访问它。现在变成了内部类是访问外围类的通道了。
第三个优势,就需要我们多看一些框架源码,有质量的源码。体会体会这个优雅了。
内部类语法
内部类语法很简单。直接在某个普通类里面写一个类就行了。这个类应该是辅助外围类完成某项功能的。代码就可以隐藏了。
内部类对象的创建,必须提前有一个外围类对象。让这个内部类对象跟外围类对象发生关联。这样,内部类才能访问外围类的字段。第192页说:内部类可以访问其外围类的方法和字段,跟自己拥有它们一样。这一项特权真的是太厉害了。
外围类经过编译后,class文件中会有一个属性。里面记录着它自己的内部类名称。
内部类用法
内部类的用法应该是10.4节,向上转型。内部类一般都是实现了某个接口或者是继承了某个基类。外围类提供了一个方法,可以返回内部类的实例。客户类直接将内部类实例转化成其接口或者是基类。 就可以随便用。 而这个内部类实例可以操作外围类的字段。让外围类表现出某种功能。 太完美的配合了。
10.8节,内部类和接口一样,都可以让Java间接的实现多重继承。 每个内部类可以继承一个基类。外围类多添加几个内部类,就可以继承多个基类。 我们为什么需要继承???因为我们想向上转型,因为我们想让子类和基类有相同的访问接口。 内部类完全可以搞定这些,实现这些功能。而内部类最终操纵的字段正好是外围类的字段。配合的太默契了。