通俗易懂的了解java的多态
还是要坚持学习啊
各种原因,一年多没写过博客了。疫情期间,在家隔离。还是要学习啊。定个目标,以后每周最少写一篇博客。记录学习,记录工作,记录生活!
什么是多态?
接下来我们来看看多态的概念:
“多态就是指程序中定义的引用变量所指向的具体类型和通过该引用变量发出的方法调用在编译时并不确定,而是在程序运行期间才确定,即一个引用变量倒底会指向哪个类的实例对象,该引用变量发出的方法调用到底是哪个类中实现的方法,必须在由程序运行期间才能决定。因为在程序运行时才确定具体的类,这样,不用修改源程序代码,就可以让引用变量绑定到各种不同的类实现上,从而导致该引用调用的具体方法随之改变,即不修改程序代码就可以改变程序运行时所绑定的具体代码,让程序可以选择多个运行状态,这就是多态性。”
上面的概念是我找到的,觉得可以很好解释什么是多态。如果不是很懂,没关系!概念这东西,没有经过实践确实是很难搞懂。
多态的实现条件
1.要有继承关系
2.子类重写父类的方法
3.父类引用指向子类
实践:
例子
我们生活在地球上,每个人都有自己的名字,年龄,性别,职业。不同的职业工作内容也不一样。程序员要写代码,医生要给病人看病,教师要传道受业。那么会有下面这个People类,有属性,还有三个方法,对应着 医生 程序员 教师需要做的事情。
package demo;
/**
* @Author zhangxiaoteng
* @Date 2021/1/13 18:35
* @Version 1.0
*/
//这是个人的类
public class People {
String name;//名字
int age;//年龄
int sex;//性别
String role;//职业
//医生做的事情
public void doctorDoing(){
System.out.println("医生要给病人看病");
}
//程序员做的事情
public void programmerDoing(){
System.out.println("努力写bug");
}
//教师做的事情
public void teacherDoing(){
System.out.println("传道受业");
}
}
问题来了:现在是只有三个职业,后面可能还会有很对职业的加入。比如:司机,厨师,警察…等.每次多一个职业,我们都需要添加添加一个新职业所对应的需要做的事情的方法。此时 我们可以修改代码
public class People {
String name;//名字
int age;//年龄
int sex;//性别
String role;//职业
//有个doing方法,表示要做的事
public void doing(String role){
if("doctor".equals(role)){
System.out.println("医生要给病人看病");
return;
}
if("programmer".equals(role)){
System.out.println("努力写bug");
return;
}
if("teacher".equals(role)){
System.out.println("传道受业");
return;
}
}
}
修改完的代码,只有一个方法。在方法中判断不同的职业去指向不同的事情。但是这么做也是有问题的,现在只是有三个职业,并且做的事情只是简单的输出一句话,实际开发中,可能会是很复杂的业务逻辑。要实现一个职业干的事情,可能得需要几十甚至几百行代码。如果一个方法中代码太多,对于阅读和维护都是很困难的一件事。所以后面我们还需要在方法中再把一些代码抽离出来,去组成新的方法。随着时间的推移,最终这一个方法中,会嵌套着N多方法。后期维护会很困难,而且耦合性太高。有一处代码出问题,可能就会导致整个方法不能使用。
如果这些你都能忍受!那么如果我现在要给医生加一个科室属性,给程序员加一个使用开发语言的属性,给教师加一个所授课程的属性。很显然这些属性不能加到people这个类中,因为医生不编程,不授课,所以没有这些属性。同理,程序员和教师也是这样的。那怎么办呢,下面就开始说道多态的第一个条件,就是继承。
什么是继承
自己的理解是子类继承父类的属性和方法,注意:如果是父类 私有的 或者静态修饰的 属性和方法 子类是无法继承的。通俗理解就是你可以继承你爸的房子,车子。但是不能继承他的身份证号,和银行卡号。因为这是他私有的只有他有。这么理解可能不是很正确,但是方便理解。
继承的关键字是:extends。
改造代码
我们都知道 姓名 姓名 年龄 等这些属性是每个人都有的。所以我们可以把 医生 程序员 教师 三个职业抽离出来,变成三个类。然后继承People这个类。这样他们即拥有了作为人的基本属性,也可能添加自己的专属属性了
一个简单的表格:
类 | 属性 |
---|---|
People(父类) | 基本属性 |
医生(子类) | 来自父类的基本属性+科室 |
程序员(子类) | 来自父类的基本属性+使用的开发语言 |
教师(子类) | 来自父类的基本属性+所授课程 |
属性既然都拆分开了,那做事情的doing方法,也拆分开,这样可以降到耦合性。使代码更好维护,更清晰。
People类
public class People {
String name;//名字
int age;//年龄
int sex;//性别
String role;//职业
//有个doing方法,表示要做的事
public void doing(){ }
}
医生类
public class Doctor extends People{
String Department;//科室
@Override
public void doing(){
System.out.println("医生要给病人看病");
}
}
程序员类
public class Programmer extends People {
String Language;//开发语言
@Override
public void doing(){
System.out.println("努力写bug");
}
}
教师类
public class Teacher extends People {
String lecture;//讲课
@Override
public void doing(){
System.out.println("传道受业");
}
}
到此多态已经完成了一多半了。想想实现多态的条件 1.有继承关系2.子类重写父类方法。我们都已经不知不觉实现了。最后一个父类引用指向子类是什么意思呢。看下面的测试代码
看出什么来没?我们同样都是用的People类型接收的,同样是掉的doing方法。但是输出的内容却是不一样的。最后再细细品一下,我上面说的多态的概念:
“多态就是指程序中定义的引用变量所指向的具体类型和通过该引用变量发出的方法调用在编译时并不确定,而是在程序运行期间才确定,即一个引用变量倒底会指向哪个类的实例对象,该引用变量发出的方法调用到底是哪个类中实现的方法,必须在由程序运行期间才能决定。因为在程序运行时才确定具体的类,这样,不用修改源程序代码,就可以让引用变量绑定到各种不同的类实现上,从而导致该引用调用的具体方法随之改变,即不修改程序代码就可以改变程序运行时所绑定的具体代码,让程序可以选择多个运行状态,这就是多态性。”
是不是有种豁然开朗的感觉!!!!!!
最后说一下,个人觉得多态做好的诠释,应该是接口。。。
比如我们常用的List接口,看下面的代码,这应该是我们开发中最常规的操作吧,这其实就是多态的应用。
最后
到这里就结束了,希望能对看到这篇文章的你有所帮助!加油!!!