新手小白学JAVA 面向对象之多态

多态

1. 概念

多态是面向对象程序设计(OOP)的一个重要特征,指同一个实体同时具有多种形式,即同一个对象,在不同时刻,代表的对象不一样,指的是对象的多种形态。

可以把不同的子类对象都当作父类来看,进而屏蔽不同子类对象之间的差异,写出通用的代码,做出通用的编程,统一调用标准。

比如,你的女盆友让你买点水果回来,不管买回来的是苹果还是西瓜,只要是水果就行,这个就是生活中多态的体现

再比如,小猫、小狗、小猪我们可以把他们都归纳成小动物,每种小动物都需要吃东西,所以我们可以统一设置他们都必须吃,但是每种小动物的习性不一样,那这个就可以设置成小动物自己特有的功能,多态对象只能调用父类中定义子类中重写的功能,并不能调用子类的特有功能,这样就实现了代码的统一

2 . 特点

  1. 多态的前提1:是继承
  2. 多态的前提2:要有方法的重写
  3. 父类引用指向子类对象,如:Animal a = new Cat();
  4. 多态中,编译看左边,运行看右边
    在这里插入图片描述

3. 练习:多态入门案例

创建包: cn.tedu.oop
创建类: TestDemo.java

package cn.tedu.oop2;
/*本类用作多态的入门案例*/
public class TestDemo {public static void main(String[] args) {//6.创建“纯纯的”对象用于测试Animal a = new Animal();Cat c = new Cat();Dog d = new Dog();a.eat();//小动物Animal吃啥都行~调用的是父类自己的功能c.eat();//小猫爱吃小鱼干~调用的是子类重写后的功能d.eat();//小狗爱吃肉骨头~调用的是子类重写后的功能/*2.父类对象不可以使用子类的特有功能*///a.jump();//报错,Animal类里并没有这个方法//a.run();//报错,Animal类里并没有这个方法c.jump();//小猫Cat跳的老高啦~,子类可以调用自己的功能d.run();//小狗Dog跑的老快啦~,子类可以调用自己的功能//7.创建多态对象进行测试/*3.口诀1:父类引用指向子类对象* 解释:创建出来的子类对象的地址值,交给父类类型的引用类型变量来保存*/Animal a2 = new Cat();//Cat类对象的地址值交给父类型变量a2来保存Animal a3 = new Dog();//Dog类对象的地址值交给父类型变量a3来保存//8.测试多态对象/*4.口诀2:编译看左边,运行看右边* 解释:必须要在父类定义这个方法,才能通过编译,把多态对象看作是父类类型*      必须要在子类重写这个方法,才能满足多态,实际干活的是子类*/a2.eat();//小猫爱吃小鱼干~,多态对象使用的是父类的定义,子类的方法体}
}
/*1.多态的前提:继承+重写*/
//1.创建父类
class Animal{//3.创建父类的普通方法public void eat(){System.out.println("小动物Animal吃啥都行~");}
}
//2.1创建子类1
class Cat extends Animal{//4.1添加重写的方法public void eat(){System.out.println("小猫爱吃小鱼干~");}//5.1添加子类的特有功能public void jump(){System.out.println("小猫Cat跳的老高啦~");}
}
//2.2创建子类2
class Dog extends Animal{//4.2添加重写的方法@Overridepublic void eat(){System.out.println("小狗爱吃肉骨头~");}//5.2添加子类的特有功能public void run(){System.out.println("小狗Dog跑的老快啦~");}
}

4. 多态的好处

  1. 多态可以让我们不用关心某个对象到底具体是什么类型,就可以使用该对象的某些方法
  2. 提高了程序的可扩展性和可维护性

5. 多态的使用

前提:多态对象把自己看做是父类类型

  1. 成员变量: 使用的是父类的
  2. 成员方法: 由于存在重写现象,所以使用的是子类的
  3. 静态成员: 随着类的加载而加载,谁调用就返回谁的

6. 练习:多态成员使用测试

创建包: cn.tedu.oop
创建类: TestDemo2.java

package cn.tedu.oop2;
/*本类用于测试多态成员的使用情况*/
public class TestDemo2 {public static void main(String[] args) {//7.创建纯纯的子类对象Dog2 d = new Dog2();System.out.println(d.sum);//20,子类自己的属性d.eat();//小狗爱吃肉包子,子类自己的方法//8.创建多态对象/*口诀1:父类引用指向子类对象*//*口诀2:编译(保存)看左边,运行(效果)看右边*/Animal2 a = new Dog2();/*多态中,成员变量使用的是父类的*/System.out.println(a.sum);//10/*多态中,方法的声明使用的是父类的,方法体使用的是子类的*/a.eat();//小狗爱吃肉包子/*多态中,调用的静态方法是父类的,因为多态对象把自己看作是父类类型* 直接使用父类中的静态资源*/a.play();//没有提示,玩啥都行~Animal2.play();}
}
//1.创建父类
class Animal2{//3.创建父类的成员变量int sum = 10;//4.创建父类的普通方法public void eat(){System.out.println("吃啥都行~");}//9.1定义父类的静态方法playpublic static void play(){System.out.println("玩啥都行~");}
}
//2.创建子类
class Dog2 extends Animal2{//5.定义子类的成员变量int sum = 20;//6.重写父类的方法@Overridepublic void eat(){System.out.println("小狗爱吃肉包子");}//9.2创建子类的静态方法play//@Override/*这不是一个重写的方法,只是恰巧在两个类中出现了一模一样的两个静态方法* 静态方法属于类资源,只有一份,不存在重写的现象* 在哪个类里定义,就作为哪个类的资源使用*/public static void play(){System.out.println("小狗喜欢玩皮球~");}
}

7 拓展

7.1 设计汽车综合案例

创建包: cn.tedu.oopexec
创建类: DesignCar.java

package cn.tedu.oop2;
/*本类用于完成汽车设计案例*/
public class DesignCar {public static void main(String[] args) {//9.创建一个纯纯的父类对象进行测试Car c = new Car();System.out.println(c.getColor());//nullc.start();c.stop();//c.swim();//报错,父类对象不可以调用子类的特有功能//10.创建纯纯的子类对象做测试BMW b = new BMW();System.out.println(b.color);//五彩斑斓的黑System.out.println(b.getColor());//nullb.start();//都让开,我的车要起飞啦~b.stop();//唉呀妈呀熄火了~//11.创建多态对象进行测试Car c2 = new TSL();//System.out.println(c2.color);System.out.println(c2.getColor());c2.stop();c2.start();//c2.swim();}
}
//1.通过分析,抽象形成一个汽车类
class Car{//2.定义并封装汽车类的属性--成员变量private String brand;//品牌private String color;//颜色private int id;//编号private double price;//价格//3.定义功能public void start(){System.out.println("我的小车车启动啦~");}public void stop(){System.out.println("唉呀妈呀熄火了~");}public String getBrand() {return brand;}public void setBrand(String brand) {this.brand = brand;}public String getColor() {return color;}public void setColor(String color) {this.color = color;}public int getId() {return id;}public void setId(int id) {this.id = id;}public double getPrice() {return price;}public void setPrice(double price) {this.price = price;}
}//4.创建子类
class BMW extends Car{String color = "五彩斑斓的黑";//5.重写父类的方法@Overridepublic void start(){System.out.println("都让开,我的车要起飞啦~");}
}
//6.创建子类2
class TSL extends Car{//7.重写父类的方法@Overridepublic void stop(){System.out.println("唉呀妈,怎么停不下来呢");}//8.添加子类的特有功能public void swim(){System.out.println("没想到吧,我还是个潜水艇");}
}

7.2 多态为了统一调用标准

package cn.tedu.oop2;public class TestFruit {public static void main(String[] args) {Fruit f = new Fruit();Apple a = new Apple();Orange o = new Orange();get(f);get(a);get(o);}//只需要创建一个方法,就可以执行截然不同的效果//忽略子类对象的差异统一看作父类类型public static void get(Fruit f){f.clean();}
}
class Fruit{public void clean(){System.out.println("水果要洗洗再吃");}
}
class Apple extends Fruit{@Overridepublic void clean(){System.out.println("苹果需要削皮");}
}
class Orange extends Fruit{@Overridepublic void clean(){System.out.println("橙子需要剥皮");}
}

7.3 静态变量和实例变量的区别

在语法定义上的区别:静态变量前要加static关键字,而实例变量前则不加。
在程序运行时的区别:实例变量属于某个对象的属性,必须创建了实例对象,其中的实例变量才会被分配空间,才能使用这个实例变量。静态变量不属于某个实例对象,而是属于类,所以也称为类变量,只要程序加载了类的字节码,不用创建任何实例对象,静态变量就会被分配空间,静态变量就可以被使用了。总之,实例变量必须创建对象后才可以通过这个对象来使用,静态变量则可以直接使用类名来引用。

7.4 向上转型和向下转型

在JAVA中,继承是一个重要的特征,通过extends关键字,子类可以复用父类的功能,如果父类不能满足当前子类的需求,则子类可以重写父类中的方法来加以扩展。
那么在这个过程中就存在着多态的应用。存在着两种转型方式,分别是:向上转型和向下转型。
向上转型:可以把不同的子类对象都当作父类来看,进而屏蔽不同子类对象之间的差异,写出通用的代码,做出通用的编程,统一调用标准。
比如:父类Parent,子类Child
父类的引用指向子类对象:Parent p=new Child();
说明:向上转型时,子类对象当成父类对象,只能调用父类的功能,如果子类重写了父类中声明过的方法,方法体执行的就是子类重过后的功能。但是此时对象是把自己看做是父类类型的,所以其他资源使用的还是父类型的。
比如:花木兰替父从军,大家都把花木兰看做她爸,但是实际从军的是花木兰,而且,花木兰只能做她爸能做的事,在军营里是不可以化妆的。

向下转型(较少):子类的引用的指向子类对象,过程中必须要采取到强制转型。这个是之前向上造型过的子类对象仍然想执行子类的特有功能,所以需要重新恢复成子类对象
Parent p = new Child();//向上转型,此时,p是Parent类型
Child c = (Child)p;//此时,把Parent类型的p转成小类型Child
其实,相当于创建了一个子类对象一样,可以用父类的,也可以用自己的
说明:向下转型时,是为了方便使用子类的特殊方法,也就是说当子类方法做了功能拓展,就可以直接使用子类功能。
比如:花木兰打仗结束,就不需要再看做是她爸了,就可以”对镜贴花黄”了

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.rhkb.cn/news/58774.html

如若内容造成侵权/违法违规/事实不符,请联系长河编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

Flask 安装与基础结构

Flask介绍: Flask 是由python开发的轻量的web框架,小巧、灵活。一个脚本就可以启动web项目。 Flask部署: 1、创建虚拟环境 命令行输入:conda -create -n 项目名 Python版本号 启动虚拟环境 activate 环境名 2、安装flask框…

小学生智力测试软件,考验小学生的智商测试,全答对算你厉害

这几年来,小学生的题目让很多人脑筋急转还是弯不过来,答不上。要是小学生能够答出来了而你不能,那你会不会觉得自己的智商遭到了碾压?肯定会吧!想不想扳回?想的话就赶紧把这道智商测试题做了吧,…

再看SimCSE

一、概述 二、要点分析原始ppt解读 2.1 作用:语义表达作用检索聚类 2.2 简述:简单的对比学习来做语义表征 预训练对比学习:最佳的语义表征方法 无监督:dropout有监督:NLI 蕴含矛盾数据 原理: 利用对比学习…

MIT最新成果:这款能「自我复制」的机器人,从飞机到火箭都能自己造!

来源:新智元 本文约2300字,建议阅读5分钟科幻成真!《超能陆战队》里能自我复制的微型机器人,被MIT造出来了? 现在的机器人,能力究竟有多离谱? 实在难以想象,就连造飞机、造火箭都成了…

PowerGram:一款功能强大的跨平台Telegram Bot工具

关于PowerGram PowerGram是一款功能强大的跨平台Telegram Bot工具,该工具基于纯PowerShell开发,支持在Windows、Linux和macOS系统上运行。如需使用PowerGram,只需要安装PowerShell 4或更高版本并连接网络即可。 Bot和Telegram服务器之间的所…

HackingTeam重磅炸弹: 估值超1000万美金带有军火交易性质的木马病毒以及远控源码泄露

[简介] 常用网名: 猪头三 出生日期: 1981.XX.XX 个人网站: http://www.x86asm.com QQ交流: 643439947 编程生涯: 2001年~至今[共14年] 职业生涯: 12年 开发语言: C/C、80x86ASM、PHP、Perl、Objective-C、Object Pascal、C#、Python 开发工具: Visual Studio、Delphi、XCode、E…

Transformers 如何模仿大脑的某些部分

来源:ScienceAI 编译:白菜叶 了解大脑如何组织和访问空间信息「我们在哪里」,「拐角处有什么」,「如何到达那里」,这仍然是一项艰巨的挑战。该过程涉及从数百亿个神经元中调用整个记忆网络和存储的空间数据&#xff0c…

攻防世界_Crypto_告诉你个秘密

攻防世界刷题记录Crypto篇 文章目录 攻防世界刷题记录Crypto篇解题步骤1.下载题目附件查看内容2.借助Python来解码3.从键盘上找到每组字母包围的字母 解题步骤 1.下载题目附件查看内容 如图所示,题目附件给出的是一个txt文件里面有两行字符串。因为只有不超过F的大…

来自Transformer + Bert + GPT 的灵魂拷问

Transformer Q:Transformer如何解决梯度消失问题的? A:残差连接 Q:为何Transformer中使用Layer Normalization而不用Batch Normalization? A:BatchNorm是对一个batch-size样本内的每个特征做归一化,LayerNorm是对每…

基于tkwinter制作的exe小工具

前言 最近事没那么多,然后同事基于tkwinter制作了一款exe造单工具,感觉挺好玩的,然后叫同事分享了一下源码,自己去学习了tkwinter各大组件的相关语法及操作,所以写篇博客分享一下 同事款工具 下面是同事写的小工具&…

【WAX链游】发布一个免费开源的Alien Worlds【外星世界】合约脚本TLM

前言 《链游Farmers World【农民世界】爆火,发布一个免费开源的脚本》 在之前的文章中,我们分享了一个开源的农民世界(Farmers World)脚本 【OpenFarmer】:https://github.com/encoderlee/OpenFarmer 经过这段时间以来的不断学习&#xff…

量子计算机细思极恐,宇宙或许只是一套虚拟程序,科学家:还有一种可能细思极恐!...

原标题:宇宙或许只是一套虚拟程序,科学家:还有一种可能细思极恐! 我不知道你是否有过类似的经历:刚从沉睡中醒来,你周围的世界就有一种奇怪的虚幻和朦胧感,当意识浮出水面,你周围的事物就回到了…

【电力电子技术速通】五、DC-DC变流电路(一)Buck与Boost

一、概述 直流-直流变流电路也称斩波电路,并且斩波这种叫法更多一些。 可以分为直接直流变流电路和间接直流变流电路,最大的区别就是后者是隔离式的,通常用高频变压器隔离,所以也叫直-交-直电路。 斩波电路的三种控制方式&#…

TrickBot和Emotet再夺恶意软件之冠

根据Check Point Software的最新分析,僵尸木马TrickBot和Emotet是10月份最流行的恶意软件,这一趋势将推动勒索软件感染的激增。 Check Point通过ThreatCloud威胁情报系统传输的数据编制了2020年10月的全球威胁指数,据说该系统每天检查超过25亿…

元宇宙,会成为下一代互联网的主场吗?

导语 | 2022 年元宇宙风靡全网,作为过去一年科技界的“当红扛把子”,引多家科技巨头“竞折腰”。近日,《福布斯》双周刊网站在报道中指出,2030 年全球元宇宙的市场规模有望高达 5 万亿美元,2023 年可能是确定其发展方向…

必然还是炒作?从技术发展来看元宇宙

关于元宇宙,已经成为了2021年一个大火的名词,国外的Facebook(现Meta)、微软、英伟达……国内的腾讯、阿里、字节跳动……各大互联网巨头纷纷入局,甚至在11月12日,中国电信也表示将在2022年启动打造元宇宙基…

元宇宙持续火热的背景下,我们普通人如何赚钱

放眼全球,最近几年,能让互联网大厂像扑了蛾子一般向前冲的风口除了区块链、智能电动汽车,就是元宇宙。 尤其那些在区块链上没有吃到什么红利,造车运动又没参与上的互联网企业,对元宇宙似乎有一种执念。 这种执念让一…

即将到来的2023,国内元宇宙开始“割”企业了?

元宇宙爆火一年后,UTONMOS即将成为全球化全部实现ERC-721协议NFT链上垂直游戏价值生态的系统平台,旨在通过利用自身所拥有的各类头部资源和游戏化打造内容层的融合,建立一个元气满满的元宇宙Web3.0平台。 通过数字藏品技术的应用&#xff0c…

元宇宙将如何影响我们的投资、就业和生活方式?

【导读】 3月10日,Roblox在纽交所上市,成为元宇宙概念第一股,首日股价上涨54%,市值超过400亿美元。近日,Facebook创始人兼CEO扎克伯格表示,要在五年左右的时间里,将Facebook从一家社交媒体公司…

元宇宙热潮:缘起、影响与展望

当下科技界和产业界最热的话题非“元宇宙”莫属。2021年3月,“元宇宙第一股”美国网络游戏和社交平台公司Roblox在纽约证券交易所上市。10月,美国互联网巨头Facebook更名为“元”(Meta),宣告其强势进军元宇宙相关产业。…