本篇是对学习【Java编程思想 第 8 章 多态】的学习总结。
在面向对象的程序设计中,多态是继抽象和继承之后的第三种基本特征
多态的作用是消除类型之间的耦合关系 多态方法调用允许一种类型表现出与其他相似类型之间的区别,只要它们是同一级基类导出来的。这种区别是根据方法行为的不同而表现出来的,虽然这些方法都可以通过同一个基类来调用
多态:同一个符号在不同语义环境下具有不同的解释 多态是通过 - 类继承接口并覆盖(重写)接口中的方法 - 子类继承父类并覆盖(重写)父类中的方法 多态性:发送消息给某个对象,让该对象自己决定响应何种行为。
对某个对象的引用视为其对基类类型的引用的做法称为向上转型
写这样一个方法,它仅接受基类作为参数,而不是那些导出类,编写的代码只是与基类打交道。这正是多态允许的。
在运行时根据对象的类型进行绑定,这就是后期绑定(动态绑定或者运行时绑定)。 方法调用机制能够找到正确的方法体,并加以调用,想一下就会得知,不管怎样都必须在对象中安置某种“类型信息”。
Java中除了static方法和final方法(private方法属于final方法)之外,其他所有的方法都是后期绑定。这意味着通常情况下,我们不必判定是否应该进行后期绑定——它会自动发生。
所以私有方法是不能覆盖的。
通常,构造器不同于其他种类的方法。在涉及多态也也是如此。 构造器并不具备多态性(它们实际上是static方法,只不过该声明是隐式的)。
在其他事物发生之前,将分配给对象的存储空间初始化成二进制的零调用基类构造器按声明顺序调用成员的初始方法调用导出类构造器的主体 class Glyph { void draw() { print("Glyph.draw()"); } Glyph() { print("Glyph() before draw()"); draw(); print("Glyph() after draw()"); } } class RoundGlyph extends Glyph { private int radius = 1; RoundGlyph(int r) { radius = r; print("RoundGlyph.RoundGlyph(), radius = " + radius); } void draw() { print("RoundGlyph.draw(), radius = " + radius); } } public class PolyConstructors { public static void main(String[] args) { new RoundGlyph(5); } } /* Output: Glyph() before draw() RoundGlyph.draw(), radius = 0 Glyph() after draw() RoundGlyph.RoundGlyph(), radius = 5调用被覆盖的draw方法,由于存储空间被初始化为0,我们发现radius的值为0.
多态总是和覆盖联系在一起。 覆盖的条件是: 1. 方法名相同 1. 方法参数相同 1. 子类返回类型<=父类返回类型
方法签名是方法名和参数列表
