复用代码的两种方法
- 组合:在新的类中产生现有类的对象。
- 继承:按照现有类的类型来创建新类,无需改变现有类的形式,采用现有类的形式并在其中添加新代码。
1.组合语法
将对象引用置于新类中
class WaterSource {
private String s;
WaterSource(){
System.out.println("WaterSource()");
s = "constructed";
}
public String toString(){ return s; }
}
2.继承语法
class Cleanser {}
public class Detergent extends Cleanser {}
2.1 初始化基类
- 基类在导出类构造器可以访问它之前,就已经完成了初始化。
- 类中含有默认的构造器,编译器可以轻松地调用它们是因为不必要考虑传递什么参数。但是,如果没有默认的基类构造器,或想调用一个带参数的基类构造器,就必须用关键字
super
显式地编写调用基类构造器的语句,并配以适当的参数列表。 - 调用基类构造器是你在导出类构造器中要做的第一件事。
3.代理
- 继承和组合的中庸之道。因为我们将一个成员对象置于所要构造的类中(组合),但与此同时我们在新类中暴露了该成员对象(继承)。
4.结合使用组合和继承
同时使用组合和继承是很常见的事。
4.1 确保正确清理
- 有时类可能要在其生命周期内执行一些必须的清理活动,需要显示地编写一个特殊的方法来做这件事,并要确保客户端程序员知晓他们必须要调用这一方法。其首要任务就是,必须将这一清理动作置于
finally子句
中,以防异常的出现。
4.2 名称屏蔽
- 如果Java的基类拥有某个已被多次重载的方法名称,那么在导出类中重新定义该方法名称并不会屏蔽在积累中的任何版本。无论是在该层或者它的基类中对方法进行定义,重载机制都可以正常工作。
5.在组合和继承之间选择
组合和继承都允许在新的类中放置子对象,组合是显式地这样做,而继承是隐式地做。
组合技术通常用于想在新类中 使用现有类的功能 而非它的接口这种情形。
6.protected关键字
protected对任何继承于此类的导出类或其他任何位于同一包内的类来说,它是可以访问的。
7.向上转型
8.final关键字
final的三种情况:数据、方法、类
8.1 final数据
- 使用final修改的常量是一块很定不变的数据,这类常量是基本数据类型,并且在定义的时候就要赋值。
- 根据惯例,即使static又是final的域(即编译期常量)将用大写表示,并使用下划线分隔单词。
- Java允许生成空白final,但必须再域定义处或每个构造器中用表达式对final赋值。
8.2 final方法
- 使用final方法的原因
- 把方法锁定,以防任何继承类修改它的含义;
- 效率。
- 类中所有的private方法都隐式地指定为final;
8.3 final类
- 将某个类的定义为final时,表明了你不打算继承该类。
- 由于final类禁止继承,所以final类中所有的方法都隐式指定为是final的,因为无法覆盖它们。
01/06/2019 :created
网友评论