组合
组合就是将对象的引用置于新的类中。这样新类就可以使用该引用来增量实现功能。
初始化这些引用的位置:
- 在定义对象的地方,这意味着在构造函数调用之前被初始化
- 在构造函数中
- 在使用这些对象之前,称为惰性初始化(如果不必要每次都生成对象的话,这种方式很好,在get方法中初始化,第一次调用get方法时进行初始化)
- 使用实例初始化(使用set方法初始化,由用户指定实例进行初始化)
继承
在继承的过程中,需要先声明“新类于旧类相似”,使用extends关键字。
当这么做的时候会自动得到基类中所有的域和方法(会全部得到,当不一定可以使用)。
继承对代码的复用方式:
- 更新旧方法,使用super调用基类的同名方法,然后基于旧方法开发新方法
- 添加新方法,并不一定非得使用基类的方法,可以在导出类中添加新方法
如果基类的某些方法不适合新类,那么可以在新类中覆盖基类的方法(在想覆盖的时候,记得使用@Override)
初始化基类:
当创建一个导出类基类时,该对象包含了一个基类的子对象。这个子对象与你用导出类直接创建的对象是一样的。
对基类子对象的正确初始化仅有一种方法来保证:在构造函数中调用基类构造函数来执行初始化(java会自动在导出类的构筑函数中插入对基类构造函数的调用,但是如果没有默认的基类构造函数,或者想调用一个带参数的基类构造函数,旧必须使用关键字super显示的编写调用基类构筑器的函数)
代理
代理本质上就是组合,将一个成员对象置于所要构造的类中(组合),但与此同时在新类中暴漏该成员对象的所有方法(就像继承)
这样的方式来重用代码,是继承与组合之间的中庸之道,使用代理比继承可以拥有更多的控制力。
在组合与继承之间选择
组合与继承都允许在新类中放置子对象,组合式显示的这样做,而继承式隐示的这样做。
组合技术通常用于想在新类中使用现有类的功能而非它的接口这种类型。(组合看重的是基类的实现,继承看重的是接口)
到底该用组合还是继承,一个清晰的判断方法就是判断是否需要从新类向基类进行向上转型(在继承树中,如果一个节点式一个方法的形参,那么它的所有子节点都可以是该方法的实参),如果必须向上转型,则继承式必要的
final关键字
final数据
- 当对基本类型使用final时,表示向编译器告知这块数据是恒定不变的
- 当对引用使用final时,表示该引用恒定不变,不可以指向别的对象,但对象本身确实可以修改的(java没有提供使任何对象恒定不变的途径)
- final参数,在参数列表中使用参数,意味着在方法中无法更改参数引用所指向的对象(与2进行区分,一个无法改变指向,一个无法改变所指的对象)
必须在域的定义处或者每个构造函数中用表达式对final进行赋值
final方法
防止任何继承类修改它,并且不会被覆盖。
类中所有的private方法都隐示地指定为final的,但你似乎好像可以“覆盖”一个private方法而不会报错。
这种情况其实不能算是覆盖,覆盖只有某方法式基类的接口的一部分时才会出现。如果时private,此时你并没有覆盖该方法,仅是生成了以个新的方法。由于private方法无法触及而且能有效隐藏,所以除了把它看成是因为它所归属的类的组织结构的原因而存在外,其他任何事物都不需要考虑它
final类
表明你不打算继承该类,而且也不允许别人这样做。
由于final类禁止继承,所以final类中所有的方法都隐式指定为final的