复用代码是Java众多引人注目的功能之一
Java中两种复用代码的机制:##
1.组合:将其他对象作为我的一个成员,为我所用。
2.继承:子类继承父类,享有父类的所有属性和方法。
通过巧妙的使用这两种机制,开发者可以创造万物,这就是面向对象的精髓所在。
很多时候我们解决的问题时需要构建一个系统:
比如车库管理系统,那我们需要将其中所见的一切都抽象出来,
车有大小型号颜色等,所以车是一个类,
每一个司机又有性别年龄和职位之分,那司机又是一个类
一个车库有车库的容量,对车的进出管理,这又是一个类
.....
开发者要做的就是抽象出这样那样的类,然后将这样那样的类进行各种各样的组合,来解决这样那样的问题。
抽象的越高级,组合越巧妙,代码越简洁健壮,那你的技术就越厉害。
所以,做开发不是在写代码,而是在培养一种创造世界的模式。
继承:继承是所有oop语言必不可少的部分##
Java中万物皆为类,Java的创造者让所有的类都源于object这个根类,这就好比所有的生物都由细胞构建而来,
细胞衍生出不同的细胞,构建成不同的组织和器官,然后构建出各色各样的生物。
初始化基类:当创建出一个导出类的对象时,该对象已经包含了一个父类的对象。
注意:Java会自动帮我在子类中的构造器中插入对父类构造器的调用。
对父类构造器的调用分为以下三种情况:
(1)父类无构造函数或者一个无参数构造函数,系统自动调调用无参的构造函数
(2)父类只有有参数构造函数,子类在构造方法中必须要显示调用父类的构造函数,否则编译出错。super("参数");
(3)父类既有无参数构造函数,也有有参构造函数,系统自动调用无参的构造函数。
因为Java的单根继承,所以:B 继承A ,C 继承B ,那么当new一个C的对象时,同时也会调用出A B的构造参数,即会生成A B 的对象。
何时选择组合何时选择继承:
通过组合和继承都可以在新的类中创建子类,但是组合是使用的显式创建而继承则是隐式创建。
使用组合的时候,是新类需要一个现有类的功能而非需要扩展它接口的形式,比如:创建一个car类,需要Window,wheel,Door的类
使用继承往往是因为当前类不能满足我们的特殊需求,此时就需要我们扩展当前类,定义我们新的功能,比如:交通工具和自行车
组合是 has-a 的语义,继承是is -a 的语义。汽车有方向盘,汽车是车。
向上转型:
由导出类转型为基类,在继承图上市向上移动的,故称为向上转型。由于向上转型是专用类转型向通用类,是安全的。
到底该用组合还是用继承:
一般情况下,慎用继承;需要使用继承的一个清晰的判断方法:问一问自己是否需要从新类向基类进行向上转型。
第七章总结:##
--1.组合和继承都能从现有的类中生产新的类型。组合一般讲现有类型作为底层实现的一部分,而继承复用的是接口、
--2.在使用继承的时候,由于导出类具有基类的接口,可以向上转型。
--3.尽管面向对象编程对继承极力强调,但开始设计时一般优先选择组合,只有在确实必要时才使用继承。组合更具有灵活性,继承是为了满足特殊的需求。
--4.当你在设计一个系统时,目标是找到或创建某些类,其中每一个类都有具体的用途而且既不会太大(包含太多的功能而难以复用),也不会太小(不添加其他功能就无法使用)。如果你的设计变得过于复杂,通过将现有类拆分为更小的部分而添加更多的对象,通常会有帮助。