0%

ThinkingInJava-4

前言

类的关系,用来概括七,八两章的内容应该足以。从第七章的继承,组合到第八章的多态。Java中能够为类设计的关系结构初步展现出来。

复用类

本书的第七章,主要内容是关于类的复用。
类的复用能够减少代码的重复,并且使得整体更具结构化,而不是杂乱无章。
复用主要依靠类的组合和继承两种方式,组合倾向于使用现有类的功能,继承则是完整复用了现有类的结构(属性,方法等)。

组合和继承

组合是将一个类的实例作为自己的属性,然后通过这个实例复用他的一些方法。
继承则可以理解为直接复用了父类的结构,在此基础上做了扩展(当然,也可以重写父类的方法)。

对于复用类的初始化两者的区别:

组合关系:复用类作为一个属性,对于他的初始化我们可以选择在定义时初始化,在构造方法中初始化,或者在
         使用到的时候才去完成初始化。
继承关系:在子类初始化之前完成父类的初始化。并且属于一种隐式操作,从外表来看,我们只是初始化了一个
         子类的实例。其实这个子类实例内部包含了一个父类实例。

基于初始化的区别可以看出,组合更像是为复用类预留了一个位置,我需要用你的时候就会初始化。而继承,父类的实例成了子类实例的一个影子,相互关系更加紧密。
当然,继承更重要的一个作用是多态。子类对象可以当作他的父类处理,即向上转型。所以如果不是必须使用向上转型,还是推荐使用组合。

代理

代理属于继承和组合的中间选择,结构上和组合一样,将复用类当作自己的属性,但方法与复用类一致,处理则是直接调用了复用类的方法。
例如:

1
2
3
4
5
6
7
8
9
10
11
public class ClassChild {
private static ClassOther co;

public void add(){
co.add();
}

public void minus(){
co.minus();
}
}

可以简单理解为为了隐藏复用类,套了一个壳子。

final

通常来说,final的修饰的含义是”不可改变”。具体到属性,方法,类上又有些差别。

  1. 属性
    对于基本类型的修饰,表示该基本类型的值,不可更改。但如果是一个对象而非基本类型的话,
    因为修饰的实际上是对象的引用,所以其实际意义是这个引用不可再指向其他对象,但不影响对象自身的修改。
  2. 方法
    对于方法的修饰可以在继承时禁止方法被重写

  3. final类不可被继承

多态

本书的第八章,多态。

后期绑定

后期绑定是确保多态能正确执行的关键之一。编译器不关心对象的具体类型,直到运行时才能判断对象的类型,从而调用正确的方法体。
Java中除了static,final,private方法外,都是后期绑定的。

协变返回类型

子类重写的方法的返回类型可以是对应父类方法中返回类型的子类

小结

  这两章的内容其实较为单一。类的继承占了很大的篇章。这也是因为继承是Java中最常用最重要的行为之一。
良好的继承关系能够提升代码的复用性,提高代码的阅读性,设计出精妙的数据结构。当然,就像第七章中表
达的那样,继承某种程度加强了代码的耦合性。所以,不是必须使用多态,更推荐组合这种更加灵活,更容易
扩展的结构。
  关于多态,其实书中举了很多使用多态的例子,包括一些问题,例如静态方法,对类数据域的访问等不过实
际开发中由于相关开发规范,并不会遇到这些问题,所以没有记录。

下一章 <ThinkingInJava-5>