你先理解下什么是多态,最基本的多态,我给你举个例子:
有一个类叫做Animal,也就是代表一个动物的类,Animal类里有一个函数 tweet(),tweet的意思是鸣叫;也就是我们在调用Animal的这个函数时,可以达到让“某种动物鸣叫”的效果。
但是不同的动物“鸣叫的声音”是不同的,所以我们为了实现不同动物不同的叫声,会继承Animal实现新的具体动物的子类,比如说Dog和Cat,在具体动物的类里去实现自己的 tweet() 鸣叫的方式,从而达到如下目的:我们在调用不同动物(Dog和Cat)的 tweet() 函数时,会有不同的效果,比如调用Dog的tweet()我们会听到狗叫,调用Cat的tweet()我们会听到猫叫。看下面的代码。
(如果你不懂子类父类的概念,你就想想Animal和Dog,Cat的例子,Animal是父类,因为Dog和Cat都是Animal的其中一种,Animal有所有动物的共性,二Dog和Cat都是具体化的一种动物,有他们自己的特性,所以他们是子类。)
// 父类
abstract class Animal {
void tweet();
}
// 狗,继承了Animal
class Dog extends Animal {
void tweet() {
"实现了狗叫的行为"
}
}
// 猫,继承了Animal
class Cat extends Animal {
void tweet() {
"实现了猫叫的行为"
}
}
//我们现在创建一只狗和一只猫,分别让他们叫。
Animal dog = new Dog();
dog.tweet();
Animal cat = new Cat();
cat.tweet();
}
上面的代码,我们通过Cat类和Dog类都继承了抽象的Animal类,并且分别实现了自己的自己的tweet()函数,就让Dog和Cat这两种可以“鸣叫”的Animal有了自己独有的鸣叫方式。这个时候我们通过创建Dog和Cat两种类型的Animal,再调用他们的tweet方法,会分别听到“猫叫”和“狗叫”。
这就是多态,通过在不同的子类对同一个函数的不同实现,来控制不同子类自己特殊的行为,也就是在这里举例子的“鸣叫”。
下面来解释你ppt上的三种多态:
1、Subtype polymorphism(子类多态)
其实这个就是我刚才举的例子,最常用的多态,就是在子类里根据自己的特性实现同一个父类方法,来达到不同的效果。
2、parametric polymorphism(参数化多态,也就是C++中的模板和Java中的泛型)
这里只能举例子来说明,看下面代码。
T add(T a, T b) {
return a+b;
}
上面的add函数,实现了a和b相加的功能,T可以在程序运行时代表任何类型
的变量,看下面的例子:
double result = add<double>(6.666, 9.999);
int result = add<int>(6, 9);
*** PS:上面两行代码,尖括号<>中的类型(double或int),是为了指定上述代码中的‘T’ ***
第一条代码,可以得到6.666和9.999相加的结果,因为这个结果是double类型(小数),所以上面那段含有“T”的代码会判断出来需要返回给你一个double(小数)的值。
同理,第二条代码运行的时候,上面那段含有“T”的代码会判断出来需要返回给你一个int(整数)的值。
也就是说,通过T来指代类型,可以让这段代码同时具有计算整数和小数相加的功能,并且返回相应类型的值。
具体到代码来看,当我们指定T为double时候,上面的代码会被解析成:
double add(double a, double b) {
return a+b;
}
而当我们指定T为int时,上面的代码会被解析成:
int add(int a, int b) {
return a+b;
}
3、Ad-hoc polymorphism(非参数化多态,最简单的就是函数重载)
参考这篇文章的1、2部分就好了:http://blog.csdn.net/lf_2016/article/details/51769789