Java学习记录-3.类的复用

对类的复用主要有两种方式,组合与继承。

组合

在一个类中使用一个类。

对于这些对象的初始化有四种方式:

1.在定义域处,这样在构造器被调用之前就会被初始化。

2.在构造器内。

3.惰性初始化,既在使用这些对象的时候初始化。

4.实例初始化。

继承

Java中任何一个对象都存在继承关系,哪怕没有指明继承的类,也会隐式地从标准根类Object进行继承。对于访问权限,即便是继承而来的子类,也需严格遵守规则,无法访问基类的private成员,包外也无法访问friendly成员。但如果必须要调用基类的private实例域,也可以定义一个get方法。子类的方法来自对基类的继承,对基类方法的覆盖和额外添加新方法。若要在子类中调用基类版本的方法,只需写为super.MethodName。

对于构造器,无参数的积累构造器是自动调用的,无需手动调用,而若要指定某个有参数的构造器,则需使用super方法,例如,在子类中调用super(i)则会调用基类中有一个参数的构造器。需要注意的事,在子类构造器中指明使用的积累构造器是很重要的,要在第一时间内写出。

对于重载方法,只要签名不同,在子类中重载方法就不会覆盖基类的方法,可以在子类中调用包括基类和子类在内的所有重载版本。

对继承的初始化是由基类像子类逐层进行的。

代理

在其他类中将该类作为成员对象(就像组合),在创建方法的时候有选择的将该类的方法包含其中,使得新的类拥有该类的接口(就像继承)。

在组合与继承之间选择

组合意味着设计者想要使用它的一些个方法,这些组合类应该使用private修饰,但当组合类自身的的具体实现都隐藏了的时候,使用public也无妨,并且可以更好的展示这个类的组合情况,如engine类有一个start()方法,而car类则组合了engine类,则可以在car类内创建一个实例engine1,在拥有一个car类的实例car1时通过car1.engine1.start()来调用。

继承则意味着想要将一个通用类特殊化,例如车类继承自交通工具类,而不是车类组合了一个交通工具类。

更多应用

同时调用组合与继承也是一种非常常用的方法。

思想

高层对象不应该依赖于低层对象,它们都应该依赖于抽象;抽象不应该依赖于细节,细节应该依赖于抽象。

posted @ 2018-04-11 16:03  超级猿  阅读(176)  评论(0编辑  收藏  举报