第七章 复用类
组合
组合的概念中最重要的是理解”has a”概念.也就是说,如果在某种抽象中一个类中有另一
个类(一个汽车类有四个轮胎类),则适用于组合的情况.在组合中必然会基类必然会包含其他类的一个引用,那么可以在以下位置对此引用进行初
始化- 定义对象引用的地方进行初始化
- 在类的构造器中进行初始化
- 惰性初始化(在使用之前进行初始化,这种方法可以避免部分开销)
- 实例初始化
从组合的概念中还可以引申出一下几个设计模式:
- 单例模式
- 代理模式
继承 extends(关键字)
继承的概念中最重要的是理解”is a”概念.也就是说,如果在某种抽象中一个类是另一个
类的一个具体实现(一个汽车类是一个通勤工具类的具体实现),则适用于使用继承的情况
.在类集成中应该注意的一些概念点
有关于基类的初始化
- 默认构造函数:如果继承类构造器中未显式的调用默认构造函数,则java编译器会自动
帮我们隐式的调用基类默认构造函数 - 非默认构造函数:若基类显式的定义了非默认构造函数(带参数的构造函数),则在导出
类构造函数中必须要调用基类的构造函数,且调用语句必须是导出类构造函数所做
的第一件事.
- 默认构造函数:如果继承类构造器中未显式的调用默认构造函数,则java编译器会自动
有关于资源的正确清理
- 此处的资源清理并非c/c++中所说的new,delete.而是譬如我们在显示器上进行了图片
显示,再譬如我们开辟socket连接等.这些情况下我们必须手动的进行清除或连接关
闭工作. - 资源清理的顺序应该同资源的生成顺序相反.即在构造其中是先构建基类资源,然后是
导出类资源.而在资源清理的时候应该是先清理导出类资源,再清理构造器资源.(大
体规则如此,但是具体情况下也有可能不同) - try…finally语句是保证资源清理语句必被调用的一个方法
- 此处的资源清理并非c/c++中所说的new,delete.而是譬如我们在显示器上进行了图片
有关于方法的重载与覆盖
- 在使用继承时,要注意导出类到底是想覆盖基类的方法,还是想要重载基类的方法.若
不小心,将会误用. - @Override注解可以防止你在不想重载基类方法时意外地对基类方法进行了重载.
- 导出类中方法中调用基类方法: super.f()
- 在使用继承时,要注意导出类到底是想覆盖基类的方法,还是想要重载基类的方法.若
继承与组合间的选择
组合和继承全部是在新的类中放置对象,组合是显示地这样做,继承是隐式的这样做.尽管面
向对象编程对于继承极力强调,但是在一开始进行设计时,一般应优先选择使用组合(或者可
能是代理设计模式),只在确定必要时才使用继承.因为相比之下组合更加灵活.
final关键字
final数据类型
- 一个永远不变的常量
- 一个在运行时被初始化的值,而且无法被改变
- 与引用结合使用时,是引用本身无法改变,但引用指向的具体内容可以被改变
- 有关于空白final: 空白final域必须在定义处,或构造函数内进行初始化.(主要用处是
final域,可以根据对象不同,具有不同的值,而域本身在定义后,又是恒定不变的)
final参数
- 有点像c/c++中的const概念,即你无法修改传入参数.(引用是无法修改本身,但是引用指
向的具体内容可以被修改) - 主要用来做数据保护(其实意义不大,因为无法做到像c/c++一样的const int const *类
型)
- 有点像c/c++中的const概念,即你无法修改传入参数.(引用是无法修改本身,但是引用指
final方法
- 被修饰词final修饰的方法在类的集成结构中是无法被覆盖的,即该final方法将被锁定,
任何集成类都无法对他进行修改. - 还有一部分效率方面的考虑(基本可以忽略)
- 被修饰词final修饰的方法在类的集成结构中是无法被覆盖的,即该final方法将被锁定,
final类
- 被final修饰的类表明任何其他类都无法从该final类进行继承.即该final类是继承层次
结构中的最后一层.
- 被final修饰的类表明任何其他类都无法从该final类进行继承.即该final类是继承层次
类的加载(重要概念,要理解类加载的先后顺序,此处是加载,而非初始化)
类的加载
- 创建类的第一个对象时进行加载
- 访问类的static方法时候进行加载
- main函数是static方法
- 普通的static方法
- 实际上构造函数也是隐式的static方法
- 总结下来,其实类是在调用其任何static方法的时被加载的
- 类被加载时,所有的static对象与代码段都会按照程序中的顺序(定义类时的书写顺序)
而依次被初始化.
存在集成结构时的类加载顺序
- 首先会加载根据集成结构加载根基类
- 之后是导出类