第8章 多态 148
8.1 再论向上转型 148 8.1.1 忘记对象类型 149 8.2 转机 150 8.2.1 方法调用绑定 150 8.2.2 产生正确的行为 151 8.2.3 可扩展性 153 8.2.4 缺陷:“覆盖”私有方法 156 8.2.5 缺陷:域与静态方法 156 8.3 构造器和多态 157 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 多态:同一个对象(事物),在不同时刻体现出来的不同状态。 多态的前提: A:要有继承关系。 B:要有方法重写。 C:要有父类引用指向子类对象。 多态的分类: a:具体类多态 class Fu {} class Zi extends Fu {} Fu f = new Zi(); b:抽象类多态 abstract class Fu {} class Zi extends Fu {} Fu f = new Zi(); c:接口多态 interface Fu {} class Zi implements Fu {} Fu f = new Zi(); 多态中的成员访问特点: A:成员变量 编译看左边,运行看左边。 B:构造方法 创建子类对象的时候,访问父类的构造方法,对父类的数据进行初始化。 C:成员方法 编译看左边,运行看右边。 由于成员方法存在方法重写,所以它运行看右边。 D:静态方法 编译看左边,运行看左边。 (静态和类相关,算不上重写,所以,访问还是左边的) 多态的好处: A:提高了代码的维护性(继承保证(体现)) B:提高了代码的扩展性(由多态保证(体现)) 多态的弊端: 不能使用子类的特有功能。 我就想使用子类的特有功能?行不行? 行。怎么用呢? A:创建子类对象调用方法即可。(可以,但是很多时候不合理。而且,太占内存了) B:把父类的引用强制转换为子类的引用。(向下转型) 对象间的转型问题: 向上转型: Fu f = new Zi(); 向下转型: Zi z = (Zi)f; 多态:多种形态(同一函数,不同形态) 1 、静态多态:程序在编译的时候就知道调用哪个方法 方法重载(Overrload) 2 、动态多态:程序在运行时才确定调用哪个方法 方法重写(Override)
8.3.1 构造器的调用顺序 157 8.3.2 继承与清理 159 8.3.3 构造器内部的多态方法的行为 162 1 2 3 4 5 6 7 8 Student s = new Student();做了哪些事情?(理解) - (1 )把Student.class 文件加载到内存 - (2)在栈内存为s 开辟空间 - (3)在堆内存为学生对象申请空间 - (4)给学生的成员变量进行默认初始化。 - (5)给学生的成员变量进行显示初始化。 - (6)通过构造方法给成员变量进行初始化。 - (7)对象构造完毕,把地址赋值给s 变量
8.4 协变返回类型 164
8.5 用继承进行设计 165 8.5.1 纯继承与扩展 166 8.5.2 向下转型与运行时类型识别 167 8.6 总结 168
书籍相关资源: pdf文档链接:https://pan.baidu.com/s/1yuWb_kI0sB3yHLBndPcyEg 提取码:scvw 书中demo: https://github.com/BruceEckel/TIJ4-code Thinking in Java 4th英文版的课后习题答案: http://greggordon.org/java/tij4/solutions.htm