Java成长之路八
多态
- 封装通过合并特征和行为来创建新的数据类型,隐藏实现通过将细节私有化把接口与实现分离;
- 如果只写一个方法以基类作为参数,不用管是哪个派生类,编写的代码只于基类打交道(向上转型);
方法调用绑定
- 将一个方法调用和另一个方法主体关联起来称作绑定,若绑定发生在程序运行前(如果有的话,由编译器和链接器实现)叫做前期绑定;
- 在运行时根据对象的类型进行绑定,后期绑定也称为动态绑定完成进行绑定;
- Java中除了Static喝final之外,都是后期绑定;
- Java中所有方法都是后期绑定来实现多态时,就可以编写只于基类打交道的代码,而且代码对于派生类来说都是能正常地工作。
- 向上转型
Shape s = new Circle();
- 多态是一项“将改变的子事物与不变事物分离”的重要技术;
- 只有非private方法才能被重写,得小心重写private方法的现象;
- 为了清晰可见,派生类中的方法名采用与基类中private方法名不同的命名;
- 如果一个方法是静态(static)的,它的行为就是不具备多态性;
构造器与类
- 在派生类的构造过程中总会调用基类的构造器,初始化会自动按继承层次结构上移,因此每个基类的构造器都会被调用到;
- 如果在派生类的构造器主题中没有显式地调用基类构造器,编译器就会默默地调用无参数构造器。
- 使用引用计数来跟踪仍然访问着共享对象的对象数量;
- 如果在构造器中调用了动态绑定方法,就会用那个方法的重写定义,然而调用结果难以预料因为被重写的方法在对象被完全构造出来之前已经被调用,这使得一些bug很隐蔽,难以发现;
- 从概念上讲构造器的工作就是创建对象,在构造器内部,整个对象可能只是部分形成——只知道基类对象已经初始化;
- 如果构造器只是构造对象过程汇总的一个步骤,且构造的对象所属的类是从构造器的类派生出的。那么派生部分在当前构造器被调用时还未被初始化。然而一个动态绑定的方法调用向外深入到继承层次结构中,可以地哦啊用派生类的方法
- 编写构造器有一种良好的规范:做尽量少的事让对象进入良好状态,尽量不要调用类中任何方法。在基类的构造器中能安全调用只有基类final方法,也可看做是final的private方法。
对象的构造器调用顺序
- 基类构造器被调用,这个步骤被递归地重复,顶级父类->派生类->底层派生类;
- 按声明顺序初始化成员。
- 调用派生类构造器的方法体。
实际初始化的过程是
- 在所有事发生前,分配给对象的存储空间会初始化为二进制0;
- 如前所述调用基类构造器;(此时调用重写后的draw()方法是在,在调用RroundGraph构造器之前调用-有重载先调用重载)
- 按声明顺序初始化成员;
- 最终调用派生类的构造器;
协变返回类型
- 表示派生类后被重写方法,可以返回基类方法返回类型;
使用继承设计
- 如果利用已有类创建新类首先选择继承的话,事情会变的复杂;
- 首先选择组合,特别是不知道使用哪种方法;
- 使用集成表达行为的差异,使用属性表达状态的变化;