JAVA入门级教学之(多态)

JAVA入门级教学之(多态)

 

怎么理解多态:你本身就该喊你爹叫爹,你让你爹叫你爹就是强制认做爹

 

 

多态的使用:

A  a = new D();

D类继承A类,父类型引用指向子类型对象


 * 关于java语言汇总的多态语法机制:【只是多态的基础语法,多态的作用后续说明】
 * 
 *     1.多态中设计的几个概念
 * 
 *         *向上转型(upcasting)
 *             子类型转父类型:自动类型转换
 *         
 *         *向下转型(downcasting)
 *             父类型转子类型:强制类型转换【需要加强制类型转换符】
 * 
 *     2.无论是向上转型还是向下转型,两种类型之间必须存在继承关系
 * 
 *       *没有继承关系,程序是无法编译通过的

 

代码演示:

 

public class Test {public static void main(String[] args) {//使用多态语法机制/** 1.Animal和cat之间存在继承关系,Animal是父类,Cat是子类* * 2.Cat is a Animal是合理的* * 3.new Cat() 创建的对象类型是Cat,a2这个引用的数据类型是Animal,可见*   它们进行了类型转换:子类型转换成父类型,称为向上转型/upcasting,称为自动类型转换*   * 4.java中允许这种语法:父类型引用指向子类型对象  */Animal a2=new Cat();/** 1.java程序永远都分为编辑阶段和运行阶段* * 2.先分析编译阶段,再分析运行阶段,如果编译无法通过,根本是无法运行的* * 3.编译阶段编译器检查a2这个引用的数据类型为Animal,由于Animal.class*      的字节码中有move()方法,所以编译通过了。这个过程我们称为静态绑定【编译阶段绑定】*      只有静态绑定成功后才有后续的运行* * 4.在程序运行阶段,JVM堆内存中真实创建的对象是Cat对象,那么以下程序在运行阶段*      一定会调用Cat对象的move()方法,此时发生了程序的动态绑定【运行阶段绑定】*     * 5.无论是Cat类中有没有重写move方法,运行阶段一定调用的是Cat对象的move方法,因为*      底层真实的对象就是Cat对象* * 6.父类型引用指向子类型对象这种机制导致程序存在编译阶段和运行阶段绑定两种不同的形态*   这种机制就叫做多态语法机制*/

--------------------------------------------------------------------------------------------------------------------------------------------------------------- 

新建一个动物类 

package com.lbj.javase11;public class Animal {public void move(){System.out.println("动物都可以移动");}}

新建一个鸟类继承动物类 

package com.lbj.javase11;public class Bird extends Animal {public void move(){System.out.println("鸟会飞");}//子类特有的行为public void fly(){System.out.println("fly method");}
}

 新建一个猫类继承动物类

package com.lbj.javase11;public class Cat extends Animal{//重写父类中继承过来的方法public void move(){System.out.println("猫会走猫步");}//不是父类中继承过来的方法//这个方法是子类对象特有的行为【不是说所有的动物都能抓老鼠】public void catchMouse(){System.out.println("猫抓老鼠");}
}

 新建一个测试类:

package com.lbj.javase11;
/*** 你本身就该就你爹叫爹,你让你爹叫你爹就是强制认做爹* * 关于java语言汇总的多态语法机制:【只是多态的基础语法,多态的作用后续说明】* * 	1.多态中设计的几个概念* * 		*向上转型(upcasting)* 			子类型转父类型:自动类型转换* 		* 		*向下转型(downcasting)* 			父类型转子类型:强制类型转换【需要加强制类型转换符】* * 	2.无论是向上转型还是向下转型,两种类型之间必须存在继承关系* * 	  *没有继承关系,程序是无法编译通过的* @author 14811****/
public class Test {public static void main(String[] args) {//使用多态语法机制/** 1.Animal和cat之间存在继承关系,Animal是父类,Cat是子类* * 2.Cat is a Animal是合理的* * 3.new Cat() 创建的对象类型是Cat,a2这个引用的数据类型是Animal,可见*   它们进行了类型转换:子类型转换成父类型,称为向上转型/upcasting,称为自动类型转换*   * 4.java中允许这种语法:父类型引用指向子类型对象  */Animal a2=new Cat();/** 1.java程序永远都分为编辑阶段和运行阶段* * 2.先分析编译阶段,再分析运行阶段,如果编译无法通过,根本是无法运行的* * 3.编译阶段编译器检查a2这个引用的数据类型为Animal,由于Animal.class* 	 的字节码中有move()方法,所以编译通过了。这个过程我们称为静态绑定【编译阶段绑定】* 	 只有静态绑定成功后才有后续的运行* * 4.在程序运行阶段,JVM堆内存中真实创建的对象是Cat对象,那么以下程序在运行阶段* 	 一定会调用Cat对象的move()方法,此时发生了程序的动态绑定【运行阶段绑定】* 	* 5.无论是Cat类中有没有重写move方法,运行阶段一定调用的是Cat对象的move方法,因为* 	 底层真实的对象就是Cat对象* * 6.父类型引用指向子类型对象这种机制导致程序存在编译阶段和运行阶段绑定两种不同的形态*   这种机制就叫做多态语法机制*/a2.move();/** 分析以下程序为什么不能调用:* 	因为编译阶段编译器检查到a2的类型是Animal类型*  从Animal.class字节码文件中查找catchMouse()方法,最终没有找到该方法*  导致静态绑定失败,没有绑定成功,也就是说编译失败了,更别说运行了*///a2.catchMouse();/**	假设想让以上的对象执行catchMouse()方法 ,怎么办?*		a2是无法直接调用的,因为a2的类型Animal,Animal中没有catchMouse()方法*		我们可以将a2强制类型转换成Cat类型*		a2的类型是Animal(父类),转换成Cat类型(子类),被称为向下转型/downCasting/强制类型转换*		*	注:向下转型也需要两种类型之间必须有继承关系,不然编译报错。强制类型转换需要加强制类型转换符**	什么时候需要使用向下转型呢?*		当调用的方法是子类型中特有的,在父类型中不存在,必须进行向下转型*/Cat c2=(Cat)a2;c2.catchMouse();//----------------------------------Animal a3=new Bird();/** 1.以下程序编译是没有问题的,因为编译器检查到a3的数据类型是Animal* 	 Animal和Cat之间存在继承关系,并且Animal是父类型,Cat是子类型* 	 父类型转换成子类型叫做向下转型,语法合格* * 2.虽然程序通过了,但是程序在运行阶段会出现异常,因为JVM堆内存中* 	 真实存在的对象是Bird类型,Bird对象无法转换成Cat对象,因为两种*   类型之间不存在任何继承关系,此时出现了著名的异常*   java.lang.ClassCastException:*   类型转换异常,这种异常总是在"向下转型"的时候会发生*///Cat c3=(Cat)a3;//--------------------------------------------/** 1.以上异常只有在强制类型转换的时候会发生,也就是说"向下转型"存在隐患(编译通过了,但是运行出错了)* * 2.向上转型只要编译通过,运行一定不会出问题* * 3.向下转型编译通过,运行可能错误* * 4.怎么避免向下转型出现 java.lang.ClassCastException:呢?* 	 -使用instanceof运算符可以避免出现以上的异常* * 5.instanceof运算符怎么用?* 	 -5.1语法格式:* 		(引用名 instanceof 数据类型名)* *   -5.2以上运算符的执行结果类型是布尔类型,结果可能是true/false* * 	 -5.3关于运算结果true/false* 		假设:(a instanceof Animal)* 		true表示:* 			a这个引用指向的对象是一个Animal类型* 		false表示:* 			a这个引用指向的对象不是一个Animal类型* * 6.java规范中要求:在进行强制类型转换之前,建议采用 instancsof运算符进行判断,避免异常的发生*///当a3引用指向的对象却是是一个Cat的时候【等同于:a3 是Cat的实例吗? 】{
//			Cat c3=(Cat)a3;//}if(a3 instanceof Cat){Cat c3=(Cat)a3;//这时候编译器就会检测}else if(a3 instanceof Bird){//a3确实是Bird类的,所以再强制转换就会成功Bird b2=(Bird)a3;b2.fly();}}}

 

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

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

相关文章

beanutils.copyproperties属性值丢失_[ASP.NET Core 3.1]浏览器嗅探解决部分浏览器丢失Cookie问...

今天的干货长驱直入,直奔主题看了前文的同学们应该都知道,搜狗、360等浏览器在单点登录中反复重定向,最终失败报错。原因在于,非Chrome80浏览器不识别Cookie上的SameSitenone属性值,导致认证Cookie在后续请求中被抛弃。截至2020/3…

JAVA入门级教学之(final关键字)

不希望任何人可以随意修改自己的东西的时候可以用final关键字进行修饰 * 1.final是一个关键字,表示最终的,不可变的 * * 2.final修饰的类无法被继承 * * 3.final修饰的方法无法被覆盖 * * 4.final修饰的变量一旦被赋值后,不可重新赋…

fopen吃内存吗 php,file_get_contents = PHP致命错误:允许的内存耗尽

我没有处理大文件的经验,所以我不确定该怎么办。我试图使用 file_get_contents 读取几个大文件;任务是使用preg_replace() 清洁和修补它们。我的代码在小文件上运行良好;但是,大文件(40 MB)触发内存耗尽错误:PHP Fatal…

倒计时小工具_这款高颜值的 APP 可以让小仙女/男神们的日子过得更精致

倒计时是大家平常都会用的功能,系统自带的工具或许也能满足一部分朋友的需求,但是对于生活精致,并且富有仪式感的小仙女和小男神们,一款普普通通的计时工具怎么能满足呢?今天推荐的这款应用——小时刻( App Store 搜索…

oracle 删除系统用户,Oracle数据库如何创建和删除用户

该楼层疑似违规已被系统折叠 隐藏此楼查看此楼1. 创建用户:SQL> create user user01 identified by user01;User created.但登录提示01045的错误,缺少CREATE SESSION权限。ERROR:ORA-01045: user USER01 lacks CREATE SESSION privilege; logon denie…

asp单元格合并后宽度没有合并_宅在家里跟着大牛从零开始学excel第五课-合并,边框,列宽行高...

接着上一课,我们制作的课程表,有人说了不好看,确实,我们就来补充和美化一下。首先我们要更改的就是字体,字体改成下图,字体大小选为18,样子就好看了很多了。仔细看上图,还却一点东西…

JAVA入门级教学之(package和import)

目录 JAVA入门级教学之(package和import) 1.包又称为package 2.怎么定义package? 3.包名的命名规范: 4.包名要求全部小写,包名也是标识符,必须遵守标识符的命名规范 5.一个包对应一个目录 6.使用了pa…

oracle数据库中分析函数大全,Oracle数据库的分析函数

over 连续的相加求各部门的薪水总和和全部总和 select name, salary, empsum(salary) over (order by emp) 连续求和sum(salary) over () 总和100*round(sal/sum(sal) over(), 5) 份额from company;sum() sum over() 求的是总和,sum over (order by ) 求的是连续的…

excel合并多个工作表_多个工作表或者多个工作簿的合并计算

哈喽,everybody,作为一个与excel打交道长达六年的职业老手,我会整理汇总一些十分有利于提高工作效率的小tip。也当作是我为自己知识点做的些许总结吧。今天我们就来聊聊如何快速合并多个工作表或者工作簿的这些事。话不多说,直接上…

JAVA入门级教学之(访问修饰符权限控制)

访问控制权限修饰符: 1.访问控制权限修饰符来控制元素的访问范围 public表示公开的,在任何位置都可以访问protected同包、本类、子类(出了包如果是子类没问题)缺省同包、本类(不能出包)private仅…

access字段属性设置下拉列表_CAD常用命令:ATTDEF(定义属性)

下面是本公众号文章分类目录,点击标题文字可打开分类文章列表:安装卸载 异常、退出 文件及输入输出 基本操作技巧 各种设置及相关问题 界面和显示相关问题 快捷键 视图设置和调整 图层 颜色 线型 字体、文字样式和文字输入 标注、引线和标注…

oracle定义转储目录,Oracle 12.1新特性:在线rename或relocate数据文件

在Oracle12.1之前的版本中要重命名数据文件或移动数据文件需要关闭数据库或把表空间/数据文件置为offline状态才可以,参考之前总结的要实现这一功能需要使用ALTERDATABASEMOVEDATAFILE语句,语法如下ALTER DATABASE MOVE DATAFILE ( filename | ASM_filen…

JAVA入门级教学之(super关键字)

目录 JAVA入门级教学之(super关键字) 1.super关键字用在构造方法中: 2.语法规则: 3.注意:super();的调用只能放在构造方法的第一行,和this();的调用规则一样 4.通过子类的构造方法去调用父类的构造方法…

lwip协议栈在linux运行,LwIP协议栈在uCOS II下的实现

1、概述:LwIP协议栈在设计时就考虑到了将来的移植问题,因此把所有与硬件、OS、编译器相关的部份独立出来,放在ucosii&LwIPsource etlwiparch目录下。因此LwIP在uCOS II上的实现就是修改这个目录下的文件,其它的文件一般不应该…

linux离线安装redmine_Feem:免流量跨平台文件传输工具,支持离线分享

Feem 是一款在文件传输领域打拼多年的产品,目前是基于 Wifi 局域网直连模式的文件传输服务,跨平台,在 Mac、PC、iOS、Android、Linux 皆有客户端。安装不同平台的客户端设备只要在同一无线网络,可以实现无提前配置式的自动配对&am…

JAVA入门级教学之(abstract抽象类)

目录 JAVA入门级教学之(abstract抽象类) 1.如何定义抽象类? 2.抽象类无法被实例化 3.虽然抽象类没有办法实例化,但是抽象类也有构造方法,该构造方法是给子类创建对象用的 4.抽象类中可以定义抽象方法 5.如果一个类…

linux 内核裁剪不当 死机,Linux編譯x86架構內核出現_stack_chk_guard未定義錯誤

背景android模擬器運行於virtualbox中,而virtualbox運行於x86架構的pc端,所以android及其Linux內核都編譯成x86架構。當virtualbox的vt未開啟的情況下android系統會出現各種問題,如arm庫游戲不能運行,桌面平凡掛死重啟。通過查看日…

a*算法流程图_光伏逆变器MPPT基本算法介绍李星硕

欢迎加入技术交流QQ群(2000人):电力电子技术与新能源 905723370高可靠新能源行业顶尖自媒体在这里有电力电子、新能源干货、行业发展趋势分析、最新产品介绍、众多技术达人与您分享经验,欢迎关注我们,搜索微信公众号:电力电子技术…

JAVA入门级教学之(接口)

目录 JAVA入门级教学之(接口) 接口也是一种引用类型,可以等同看做类 1.如何定义接口,语法: 2.接口中只能出现: 3.接口其实是一个特殊的抽象类,特殊在接口是完全抽象的 4.接口中没有构造方…

java 线程状态_浅析Java中的线程状态

一、线程的5种状态众所周知,Java的线程状态有5种,分别对应上图中五种不同颜色,下面对这5种状态及状态间的转化做相应的解释: 1. 初始化状态:新建一个线程对象 2. 可运行状态:其他线程调用了该线程对象的sta…