教女朋友学编程之 --- 多态

你先理解下什么是多态,最基本的多态,我给你举个例子:
有一个类叫做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

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

推荐阅读更多精彩内容

  • 2014年的苹果全球开发者大会(WWDC),当Craig Federighi向全世界宣布“We have new ...
    yeshenlong520阅读 2,311评论 0 9
  • 程序在运行的过程中,根据传递的参数的不同,执行不同的函数或者操作不同的代码,这种在运行过程中才确定调用的方式成为运...
    云Shen不知处阅读 406评论 0 0
  • 一.成员变量与局部变量的区别 成员变量:在类中定义,用来描述对象将要有什么(属性)。可被本类方法和其他跟当前类有关...
    jeffierw阅读 559评论 0 0
  • 在OOP程序设计中,当我们定义一个class的时候,可以从某个现有的class继承,新的class称为子类(Sub...
    chen_000阅读 251评论 1 1
  • 1.面向对象三大特性 -封装性 -继承性 -多态性 2.什么是封装 封装性就是隐藏实现细节,仅对外公开接口。 3....
    梦夜繁星阅读 1,109评论 0 6