多态性
“面向对象的程序设计语言的第三种最基本的特征-多态性。”
抽象:创建出新的数据类型class(成员变量和成员方法)。
封装:将接口与实施细节分离。
继承:代码复用。
多态:实现了“是什么”与“怎样做”两个模块的分离。
可扩展:在需要时易于添加新功能。
一、upcasting
1.将子类的对象作为父类的对象使用。这就叫upcasting。
2.子类的接口被窄化
3.为什么要upcasting
4.比较Music.java 和Music2.java
二、多态性
1. 多态性也叫动态绑定、推迟绑定、运行期绑定、晚绑定
2. 绑定(Binding):将一个方法调用同一个方法主体连接到一起。
3. 早期绑定:由编译器和链接程序,在程序运行以前执行绑定。主观上可以判断调用的是那个方法。
4. 动态绑定:绑定在运行期间进行。
l 必须能在运行期间判断对象的类型,并分别调用相应的方法。
5. 在Java中,除非一个方法已被声明成final或static,否则方法的绑定就是动态绑定。
6. 声明成final的方法的好处:防止其他人覆盖那个方法;“关闭”动态绑定,提高效率。
Shapes.java
三、可扩展
Music3.java
四、覆盖与过载(注意private方法)
1. 过载”是指同一样东西在不同的地方具有多种含义;
2. “覆盖”是指它随时随地都只有一种含义,只是原先的含义完全被后来的含义取代了。
五、抽象类和抽象方法
1. 用abstract关键字来修饰一个类时,这个类叫做抽象类;它包含有0个或多个抽象方法。不能创建属于它的对象,只能被继承。
2. 用abstract来修饰一个方法时,该方法叫做抽象方法。只含有一个声明,没有方法主体。
3. 含有抽象方法的类必须被声明为抽象类。
4. 如从一个抽象类继承,而且想生成新类型的一个对象,就必须实现父类中的所有抽象方法。如果不这样做,子类也会是抽象的。
5. 一个类抽象以后,并不会强迫我们将它的所有方法都同时变成抽象。
六、构建器和多形性
1. 构建器的调用顺序:Sandwich.java
初始化总结
例:Beetle.java
1、 运行Beetle时(java Beetle),首先装载程序根据Beetle.main到外面找到Beetle.class类。
2、 在装载过程中,装载程序注意它有一个父类Insect,无论是否准备生成Insect的一个对象,都会将Insect.class载入。若Insect也含有父类,则Insect的父类随即也会载入,以此类推。
3、 在根父类(此时是Insect)执行static成员变量初始化,再在下一个子类执行,以此类推。
4、 创建对象。
l 首先,子类中的所有基本数据类型都会设成它们的默认值,而将对象句柄设为null。
l 调用父类构建器:构建器采用与子类构建器完全相同的处理过程;父类的非static成员变量执行规定初始化。创建父类对象。
l 子类的非static成员变量执行规定初始化。
l 最后,执行构建器剩余的主体部分,创建子类对象。
2. 继承与清理:Frog.java
在自己定义清除方法时,子类覆盖了父类的清除方法,一定要记住记住在子类的清除方法中调用父类的。
3. 构建器内部的多形性方法的行为:PolyConstructors.java
设计构建器时一个特别有效的规则是:用尽可能简单的方法使对象进入就绪状态;如果可能,避免调用任何方法。在构建器内唯一能够安全调用的是在基础类中具有final属性的那些方法
七、通过继承进行设计
1. 用继承表达行为间的差异,并用成员变量表达状态的变化。
2. 纯继承与扩展
3. 下溯造型与运行期类型标识