文档章节

深入理解多态(磨砺营马剑威java)

磨砺营
 磨砺营
发布于 2016/08/30 08:50
字数 1317
阅读 6
收藏 0

【威哥说】王健林一句话,刷爆了朋友圈。“先定一个能达到的小目标,比方说我先挣它一个亿”。好吧,也许我们没有那样的霸气,至少我们可以实现这样“先定一个能达到的小目标,比方说学会多态”。 【正文】今天带大家深入理解面向对象的三大特征之一多态。

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

首先咱们举几个例子来说明多态的概念。话说威哥儿子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、方法的多态性

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

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

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

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

更多内容关注微信公众号mjw-java或访问www.moliying.com

© 著作权归作者所有

共有 人打赏支持
磨砺营
粉丝 5
博文 80
码字总数 97977
作品 0
昌平
读《深入理解Java虚拟机》- 笔记08

《深入理解Java虚拟机:JVM高级特性与最佳实践》第2版 第10章 早期(编译期)优化 59. 语法糖 在计算机语言中添加某种语法,对语言的功能没有影响,但是方便开发人员使用。 泛型是一种语法糖...

阿历Ali
08/18
0
0
操作系统,windows编程,网络,socket

首发:个人博客,更新&纠错&回复 之前关于c/s的一篇博文只记了思路没记代码,而且表达不清晰,事后看不知所云,这个习惯要改。 这十几天学了点关于操作系统、windows编程和网络,主要看的书有...

祁达方
2015/11/11
0
0
My java——JVM(java 虚拟机)一

JVM是Java Virtual Machine(Java虚拟机)的缩写。一般我们在学习java中会用到很多缩写名称,如JRE、JDK、SDK、JAVA SE、JAVA EE、JAVA ME、JAVA FX、还有j2se、j2ee、javaee5,我勒个去!多...

tngou
2013/03/13
0
2
Java编程思想 第1章 对象导论

Bruce Eckel 前辈写的《Java编程思想》把问题探讨得非常深入,非常建议同行都学习一下。学习 Java 语言时,老师告诉你 What,自己练习知道 How ,Bruce Eckel 告诉你Why 。 之前已经把后面的...

木云凌
2016/02/23
0
0
面试中关于Java虚拟机(jvm)的问题看这篇就够了

最近看书的过程中整理了一些面试题,面试题以及答案都在我的文章中有所提到,希望你能在以问题为导向的过程中掌握虚拟机的核心知识。面试毕竟是面试,核心知识我们还是要掌握的,加油~~~ 下面...

snailclimb
05/12
0
0

没有更多内容

加载失败,请刷新页面

加载更多

中文地址

火力全開
9分钟前
0
0
71:循环之for、while、break、continue、exit

1、for循环语法: for 变量名 in 条件;do......;done 1:案例1:求1加到100的和: [root@localhost_02 for]# vim for1.sh #!/bin/bashsum=0for i in `seq 1 100`do sum=$[$sum...

芬野de博客
12分钟前
0
0
Log4j2 Analysis

Log4j2 improvement compare with Log4j : AsyncLogger : Implemented by LMAX Disruptor technology (a lock-free inter-thread communication library, instead of queues, resulting in h......

Yixin_Nemo
22分钟前
0
0
玩转js之——new方法的模拟实现

已知new的作用 1.实例可以访问到构造函数的属性和方法 2.实例可以访问到构造函数原型中的属性和方法 //demo:function Person(name, age) { this.name = name this.age = age}Person...

lsner
22分钟前
0
0
SQL--索引使用(1)

以下是优化真实环境sql。 一、原始sql查询时长如下 二、EXPLAIN分析如下,说明 关于explain的讲解详见我另一篇文章 三、结合sql语句分析出 3.1 可以单独给business_id加索引,会优化一部分效...

求是科技
24分钟前
0
0

没有更多内容

加载失败,请刷新页面

加载更多

返回顶部
顶部