java多态理解通俗,说说 Java 多态那些事儿~_求求你做个人吧的博客-程序员宅基地

技术标签: java多态理解通俗  

都说面向对象有三大特性:封装、继承、多态。前两个在 Python 中很常见,也一直再用,就不特别整理了。但是在多态这个地方就跟 Java 有点不同。我们仔细研究一下看看。

多态 Polymorphism 分为两种,编译时多态,就是函数重载啦(overload)注意与下面的 override 区别一下。还有一个是运行时多态,我们今天主要研究研究这个。

要想理解好多态,我们得先知道 emmm 很多事情,,,,让我一件一件来说。

1. 强制类型转换

首先就是 Java 中的类型转换,其实这个没啥可说的,只是需要注意一件事情,类型转换数据本身没有变化。比如下面这段代码,变量 a 一直都是一个 char 类型的变量,只是将它暂时作为 int 型的变量使用一下。

class Hello{

public static void main(String [] args){

char a = 'a';

int num = a;

System.out.print(num);

}

}

2. 覆写

在继承关系中,子类如果定义了一个与父类方法完全相同(函数名、参数列表、返回值类型)的方法,被称为覆写(Override)。

注意与重载(Overload)进行区分,重载是指一个类中的两个方法函数名和返回值一样,但是参数列表不同。

另外:方法名相同,方法参数相同,但方法返回值不同,也是不同的方法。在Java程序中,出现这种情况,编译器会报错。

3. 程序绑定

绑定指的是一个方法的调用与方法所在的类(方法主体)关联起来。分为静态绑定和动态绑定。

直接举个动态绑定的例子吧,比如说有人结婚邀请你家去参加婚礼,但是具体谁去还不一定,有可能是你妈妈,有可能是你,有可能是你妹妹,这要看当时你们家谁有空(说不定后来你们家来了个亲戚,婚礼的时候你们都没空,就让他去了)。要是静态绑定呢,指定是谁,就必须是谁,而且编译的时候这个人必须已经存在。

比如我对于静态绑定(像 C 语言),指定使用哪个对象就是哪个对象,指定哪个属性,这个属性就必须存在。

对于动态绑定(比如 Python 支持的动态绑定),调用一个对象的方法,如果这个方法里使用到了一个属性,但是我的这个类还没有这个属性,它是在运行过程中产生的。也不用管这个属性属于哪个对象,这个属性是啥时候才有的,只要在我执行这个方法的时候这个对象里面有我想要的属性就 ok 。

Java 是一个比较折衷的语言,java 当中的方法只有 final,static,private 和构造方法是静态绑定,剩下的都是动态绑定。

4. 上转型对象

然后就是上转型对象,简单点来说,上转型对象就是对象级别的强制类型转换。这是一个 引用变量的声明类型与其实际类型不符 的例子。

将子类对象赋值给一个父类的引用类型变量,(将子类理解为一个父类使用,没有转化!!)这个父类引用所指向的对象就叫上转型对象。

23317e8cb27e

上转型对象的特点:

父类引用不能访问子类新增的成员(属性和方法);

父类引用访问父类中被隐藏属性时访问的是子类继承(父类)的属性。

父类引用调用被子类覆写的父类方法时调用的是子类覆写后的方法

(有没有想起来 C++ 中的虚函数)

上转型对象就是动态绑定的一个体现,比如在使用父类引用调用被子类重写的方法的时候,我不去管这个对象是哪个类的,只要里面有我要的方法就行,自然这样调用的就是被子类重写的方法。

我们先来看一个例子:

public class Area{

public static void main(String[] args){

Animal dog1 = new Dog();

dog1.run();

System.out.println(dog1.age);

}

}

class Animal{

public int age = 0;

public void run(){

System.out.println("动物跑。。。");

}

}

class Dog extends Animal{

public int age = 100;

@Override

public void run(){

System.out.println("狗跑。。。");

}

}

## 狗跑。。。

## 0

注意这个结果,方法可以被覆写,所以使用的是覆写之后的方法,但是属性没有覆写这一说,所以使用的就还是父类继承下来的属性。

还有在子类里面可以使用装饰器 @Override 标识一个覆写函数,这样解释器就可以帮我们检查是否真的是覆写。

不同的子类覆写的方式也不同,这样调用相同的父类方法,对于不同的子类,所得到的结果就不同,这就是多态的效果。

5. 多态

正如上文所说,多态就是 同样的行为(同一段代码)作用于不同对象时产生不同的效果。

多态想要解决的问题主要是:设计和实现的分离,这样修改设计,修改实现都非常容易。另外这样写的话代码量也会比较少,也比较容易阅读。

比如看下面这个代码:

public class TestPolymorphism{

public static void main(String [] args){

Dog dog = new Dog();

Cat cat = new Cat();

Bird bird = new Bird();

dog.saySomething();

cat.saySomething();

bird.saySomething();

}

}

class Dog{

public void saySomething(){

System.out.println("汪汪汪......");

}

}

class Cat{

public void saySomething(){

System.out.println("喵喵喵......");

}

}

class Bird{

public void saySomething(){

System.out.println("啾啾啾......");

}

}

这个例子太经典了....

下看一下使用多态的实现

class TestPolymorphism{

public static void animalSaySomthing(Animal an){

an.saySomething();

}

public static void main(String [] args){

Dog dog = new Dog();

Cat cat = new Cat();

Bird bird = new Bird();

animalSaySomthing(dog);

animalSaySomthing(cat);

animalSaySomthing(bird);

}

}

class Animal{

public void saySomething(){}

}

class Dog extends Animal{

public void saySomething(){

System.out.println("汪汪汪......");

}

}

class Cat extends Animal{

public void saySomething(){

System.out.println("喵喵喵......");

}

}

class Bird extends Animal{

public void saySomething(){

System.out.println("啾啾啾......");

}

}

当我们不光想要动物叫还想让他们做其他事情的时候,多态的好处就显现出来了,比如说我还想增加跑,吃,上树的方法,按照第一个的话那就需要为每一个都增加一个方法,然后每一个调用一遍,但是使用多态的话我们只需要在Animal 类中增加相应的接口,然后在子类中实现它。

额,,看到这里你一定会说这不是更麻烦了嘛,,,emmm,对于这个例子来说确实是这样,在实际生产环境中,也就是对于大型程序,多态主要是用在接口中,那个时候才能真正体现 Polymorphism 的作用。

版权声明:本文为博主原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。
本文链接:https://blog.csdn.net/weixin_30066779/article/details/116068586

智能推荐

ajax统一返回判定,es5中判断多个ajax全部执行完成后进行回调_不知盗的博客-程序员宅基地

$.when() jQuery中的api$.when($.ajax({url: url,dataType: "jsonp",data: {"movieId": 248906},success: function(data) {var data = data.data.data;var actorList = data.stars.split(',').join(' | ');var type = ...

智慧园区解决方案2_公众号:肉眼品世界的博客-程序员宅基地

推荐阅读:世界的真实格局分析,地球人类社会底层运行原理不是你需要中台,而是一名合格的架构师(附各大厂中台建设PPT)企业IT技术架构规划方案论数字化转型——转什么,如何转?企业10大管理流...

用javascript动态创建并提交表单form,表格table_weixin_30663391的博客-程序员宅基地

<script>//helper function to create the formfunction getNewSubmitForm(){ var submitForm = document.createElement("FORM"); document.body.appendChild(submitForm); submitForm.method = "POST"; ...

java io 多线程_JavaIO流操作及多线程_邓炯源的博客-程序员宅基地

Java IO 流操作及多线程• JAVA流的概念• 字符输入输出流• 字节输入输出流• JAVA中文件与目录管理• 线程基本概念• 线程同步• 线程死锁• 线程挂起、恢复与终止1 、Java 流的概念流(Stream)是指在计算机的输入输出操作中各部件之间的数据流动。按照数据的传输方向,流可分为输入流与输出流。Java语言里的流序列中的数据既可以是未经加工的原始二进制数据,也可以是经过一定编码处...

联想启天m410进bios_联想启天m410电脑U盘重装win10系统教程_weixin_39611930的博客-程序员宅基地

如果想要电脑以高效易用为主的话可以选择联想启天m410,其搭载英特尔第七代酷睿处理器,是一台性能强大的办公电脑,能让工作事半功倍。那么这台联想启天m410电脑如何用U盘重装win10系统呢?下面快启动小编就跟大家介绍联想启天m410电脑U盘重装win10系统教程。u盘是必备的,容量至少8G以上,因为你需要将一个win10系统镜像拷贝进去,容量太小怕是装不下。步骤大概分为两步,第一步是制作u盘启动盘...

字节跳动《算法中文手册》高清版.pdf_普通网友的博客-程序员宅基地

今天给大家推荐一份曾经火爆全网的算法中文小册,据说有不少小伙伴靠这份指南成功掌握了算法的核心技能,成功拿到了 BAT offer。先来给你们看看里面具体都有哪些内容:目前上述内容已打包成...

随便推点

分光和镜像两种用户流量采集方式_weixin_34128839的博客-程序员宅基地

IP网中的用户流量采集方式有多种方式,例如Port Montoring、WCCP协议(Web Cache Communication Protocol)的流量重定向、分光器流量采集、四层交换机的流量重定向等,在具体应用时,可根据网络结构、网络流量、设备特点等情况决定采用合适的流量采集方式。现对Port Montoring和分光器两种方式分别进行说明,并进行分析比较。方式一:...

AFLW:Annotated Facial Landmarks in the Wild: A large-scale, real-world database for facial landmark_JensLee的博客-程序员宅基地

简单翻译了一下AFLW的论文(解释说明书)。AFLW是一个人脸库,一共有25993张人脸图像,它最突出的特点是在人脸关键点上定位了21个点,更容易被检测。其次图片质量比较高,不仅仅是室内,还有室外,侧脸等难于检测的情况都涵盖在它的人脸库中。AFLW提供alw.sqlite,数据里面记载了每张图片的信息,及标志点等等。后期再补上翻译。链接仅可用于学校研究,请勿外传。我本人用其测试一下...

电大计算机操作系统形考作业,电大操作系统形考任务及答案01_段云琦的博客-程序员宅基地

《电大操作系统形考任务及答案01》由会员分享,可在线阅读,更多相关《电大操作系统形考任务及答案01(8页珍藏版)》请在人人文库网上搜索。1、任务01一、单项选择题(共24道试题,共72分。)得分:721.在计算机系统中,操作系统是( )。 A. 处于裸机之上的第一层软件B. 处于硬件之下的低层软件C. 处于应用软件之上的系统软件D. 处于系统软件之上的用户软件满分:3分2.按照所起的作用和需要的运...

(4.0.30)PreferenceFragment详解_fei20121106的博客-程序员宅基地

【声明】欢迎转载,但请保留文章原始出处→_→生命壹号:http://www.cnblogs.com/smyhvae/文章来源:http://www.cnblogs.com/smyhvae/p/4020469.html【正文】一、PreferenceFragment的引入:PreferenceActivity是一个非常有用的基类,当我们开

cordova 调用蓝牙_使用Cordova插件实现两个app之间的相互调用和通讯_世界上最后一只猫的博客-程序员宅基地

几年前使用Cordova 进行两个app之间的相互调用和通讯;当时也是几经折腾,今天把它整理出来,理一下思路,也方便有同样需求的朋友参考一、require引入 pluginrequire("cordova!com.lampa.startapp-master");这个插件下载 https://github.com/dengxiaoning/com.lampa.startapp(申明:该插件参考htt...

jQuery技术内幕:深入解析jQuery架构设计与实现原理. 3.4 Sizzle( selector, context, results, seed )..._weixin_34214500的博客-程序员宅基地

3.4 Sizzle( selector,context, results, seed )函数Sizzle( selector, context, results, seed )用于查找与选择器表达式selector匹配的元素集合。该函数是选择器引擎的入口。函数Sizzle( selector, context, results, seed )执行...

推荐文章

热门文章

相关标签