多态,动态方法调度(dynamic method dispatch)?
Posted mark-to-win
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了多态,动态方法调度(dynamic method dispatch)?相关的知识,希望对你有一定的参考价值。
8.多态Polymorphism,向上转型Upcasting,动态方法调度(dynamic method dispatch) (视频下载) (全部书籍)
什么叫多态?简言之,马 克 - t o - w i n:就是父类引用指向子类时,父类和子类必须同时拥有某个同名函数,父类引用到底指向谁(调用谁的函数),是在runtime时决定的,因此呈现多种状态(不知道会指向若干子类中的哪一个还是父类自己)。拿上一节的例子来讲,比如运行时如果用户输入自行车,就执行自行车的驾驶方法。如果用户输入小轿车,就执行小轿车的驾驶方法, 涉及到用户,这些都只能在运行时才能干。运行时的,就是动态的,所以这也是动态方法调度(dynamic method dispatch), 既然是父类指针指向子类,这也是向上转型Upcasting(为什么是向上?看我本章的第一张图:父类 fuLei=(父类)new 子类(); ,,,,感觉到一种向上转型的意味吗?子类 zilei=(子类)fulei; 这是向下转型)。顺便提一句。马克-to-win:学术界另有一种说法,overload也算多态。我认为这只是学术上的一种说法而已,张三爱这么认为,李四爱那么认为,无所谓对错。不像语法错误,错了,编译器真不让你通过。不过本书作者不支持这种overload说法。
多态有什么用?马 克 - t o - w i n:(视频下载) (全部书籍)我给大家想了两个需求: 1)要求程序运行起来以后,如果用户输入自行车,就执行自行车的驾驶方法。如果用户输入小轿车,就执行小轿车的驾驶方法。这是就用到父类指针指向子类时的override。2)如果你有一千个子类。要求你依次执行这一千个子类当中的打印。你当然可以一个一个实例化子类后分别执行。马克-to-win:累也累死了,你可以编一个循环。用通用的基类指向所有的派生类。几行程序即可,你可以参照本节的例子。不用这技术, 还真解决不了这问题!
Polymorphism means one type,many form
Dynamic method binding(dynamic method dispatch),方法覆盖仅在两个方法的名称和类型声明都相同时才发生(override)。
动态方法调度(dynamic method dispatch)是一种在运行时而不是编译时调用方法的机制。
动态方法调度也是Java实现运行时多态性的基础。 马克-to-win:要想实现多态,父类和子类必须同时拥有这个同名函数。否则实现不了多态, 底下给出了例子,说明这点。note
that when
1)base pointer point to derived class to realize dynamic dispatching,an
important requirement is that you also need to
have the same-name method in the
base class.refer to the following example of SuperClass.
抽象类和非抽象类二者都可以用来创建对象引用,马克-to-win:用来指向一个子类对象,实现多态。note that abstract and non-abstract class both can dynamically bind for example the following
example.
例1.8.1---本章源码
abstract class FigureMark {
double dime1;
double dime2;
/*这里的构造函数,是为子类调用使的,不是用来实例化的。马克-to-win: constructor is for subclass‘s constructor‘s calling, not for
instantiating. */
FigureMark(double a, double b) {
dime1 = a;
dime2 = b;
}
// area is now an abstract method
abstract void area();
}
class RectangleMark extends FigureMark {
RectangleMark(double a, double b) {
super(a, b);
}
// 覆盖
void area() {
。。。。。。。。。。。。
详情请见:http://www.mark-to-win.com/index.html?content=JavaBeginner/javaUrl.html&chapter=JavaBeginner/JavaBeginner3_web.html#Polymorphism
以上是关于多态,动态方法调度(dynamic method dispatch)?的主要内容,如果未能解决你的问题,请参考以下文章
不使用 instanceof 的重载方法的动态调度(运行时多态性)