对多态的深入理解

【威哥说】王健林一句话,刷爆了朋友圈。“先定一个能达到的小目标,比方说我先挣它一个亿”。好吧,也许我们没有那样的霸气,至少我们可以实现这样“先定一个能达到的小目标,比方说学会多态”。

【正文】今天带大家深入理解面向对象的三大特征之一多态。

多态:同一事物的多种形态。

首先咱们举几个例子来说明多态的概念。话说威哥儿子leo比较喜欢小动物,所以家里养了小猫,小狗和乌龟。咱们学了继承关系,所以如果有分析的话需要四个类:

共同的父类:Pet(宠物)

abstract class Pet{

abstract void run();

}

针对小狗我们会有一个狗类,来继承宠物类,并重写run的方法:

class Dog extends Pet{

void run() {

}

}

此时我们根据之前面向对象知识,如果说创建一个狗类的话写法是:

Dog d = new Dog();

也就是声明一个狗类型的变量,并通过构造方法完成初始化,现在我们可以说有一只小狗叫做d;现在看着迎面跑来的这个小狗,威哥笑着对leo说:“leo,你的小宠物跑来了”。注意这里的重点,你的小宠物跑过来了,你的小宠物,对,你没看错,是小宠物,那么咱们这个现实生活中的逻辑在代码里同样是通的,具体表现为:

Pet d = new Dog();

也就是说,我们有一只狗,我们也可以叫做小宠物,专业叫法叫做:

父类引用指向子类对象

那有人说这个怎么跟多态能扯上关系,简单点理解就是一个对象,多种形态,左边是一种宠物形态,右边是一个狗形态,这不就是多态么。

理解了多态的概念,那么咱们看看在程序中多态具体体现在那些方面:

1、对象的多态性:

我们看看对象的多态性如何引申出来。

现在我们要调用的话就是,在测试类中直接定义run方法,传入Dog类型的参数,然后在主方法中创建Dog对象,直接调用run方法,传入dog,具体代码如下:

public static void main(String[] args) {

Dog dog = new Dog();

run(dog);

}

public static void run(Dog dog){

dog.run();

}

现在我又多了一个猪类:

猪类:

class Pig extends Pet{

void run() {

}

}

此时猪受宠了,leo又想看猪蠢萌的跑法了,那么此时又得定义

public static void main(String[] args) {

Dog dog = new Dog();

run(dog);

Pig pig = new Pig();

run(pig);

}

public static void run(Dog dog){

dog.run();

}

public static void run(Pig pig){

pig.run();

}

然后在main方法中创建Pig对象,然后调用run方法将pig对象传入进去。

哎,此时咱们帅气的leo小男神看了龟兔赛跑,又想看乌龟跑了,那么此时得创建一个乌龟类:

乌龟类:

class Tutle extends Pet{

void run() {

}

}

同样的,需要调用的话,又得写一个方法,传入乌龟的参数类型,具体如下:

public static void main(String[] args) {

Dog dog = new Dog();

run(dog);

Pig pig = new Pig();

run(pig);

Tutle tutle = new Tutle();

run(tutle);

}

public static void run(Dog dog){

dog.run();

}

public static void run(Pig pig){

pig.run();

}

public static void run(Tutle tutle){

tutle.run();

}

此时我们发现run方法是大量的重复,而且处理都是直接调用run方法,那么咱们之前也说了父类引用能指向子类对象,那么咱们就可以直接来个升级版:

public static void run(Pet pet){

pet.run();

}

此时,不管你传入狗还是猪还是乌龟,都可以直接调用抽取出来的run方法,因为我们说了无论是狗,乌龟,还是猪都属于宠物类型,都可以直接

public static void main(String[] args) {

Dog dog = new Dog();

run(dog);

Pig pig = new Pig();

run(pig);

Tutle tutle = new Tutle();

run(tutle);

}

此时结构就很明朗了,那么此时我们显而易见的是我们可以总结出扩展的好处了:

a) 提升了代码的复用性;

并且,我们还有一点就是,如果后边leo又准备买一只兔子,那么我们可以直接使用run方法,创建兔子对象传入即可,所以,此处还有第二个好处:

b) 提高了代码的扩展性,前面定义的结构利于后边使用。

当然,针对接口也是一样的,上面的父类指父类结构,包括父类和父类接口。

2、方法的多态性

方法的多态性包括方法的重载,方法的重写等。同样也是一个事物多种形态的体现。

此处我们简单跟大家总结一下重载和重写的概念:

重载:同一类中,方法名相同,参数列表不同,返回值类型不能作为重载的判断条件

重写:子父类中,方法名相同,参数列表相同,返回值相同,子类重写的权限要不小于父类方法的权限,子类中抛出的异常不能大于父类中抛出的异常。

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 212,542评论 6 493
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 90,596评论 3 385
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 158,021评论 0 348
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 56,682评论 1 284
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 65,792评论 6 386
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 49,985评论 1 291
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 39,107评论 3 410
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 37,845评论 0 268
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 44,299评论 1 303
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 36,612评论 2 327
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 38,747评论 1 341
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 34,441评论 4 333
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 40,072评论 3 317
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 30,828评论 0 21
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 32,069评论 1 267
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 46,545评论 2 362
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 43,658评论 2 350

推荐阅读更多精彩内容