Java连载47-多态基础语法、作用
一、多态的语法
1.两个类之间没有继承关系的,使用多态是不能编译的。
2.无论向上还是向上转型,都需要有继承关系。
3.什么时候需要向下转型?
当调用的方法或者属性是子类型特有的,在父类型中不存在,就需要向下转型。
4.著名异常:java.lang.ClassCastException
package com.bjpowernode.java_learning; public class D47_ { public static void main(String[] args) { Animal46 a3 = new Cat46(); //a3.catchMouse();//这里使用的方法在Animal46中不存在,但是在Cat46中存在,所以需要强制类型转换 Cat46 c4 = (Cat46)a3; Animal46 a5 = new Bird46(); /**Cat46 c5 = (Cat46)a5; * * 上面这个程序编译是没有问题的,因为编译器检查到a5的数据类型是Animal46,Animal46和Cat46之间是存在 * 继承关系的,并且Animal46是父类型,Cat46是子类型,父类型转换为子类型叫做向下转换类型,语法是合法的, * 程序虽然编译通过了,到那时程序在运行阶段会出现异常,因为JVM堆内存中真是存在的对象是Bird类型,Bird * 对象是无法转换为Cat对象的,因为两种类型之间不存在任何继承关系此时就会出现著名的异常: * java.lang.ClassCastException * 类型转换异常,这种异常总是在“向下转型”的时候会发生。 *可以修改为: *if(a5 instanceof Cat46){ * Cat46 c5 = (Cat46) a5;} *else if(a3 instanceof Bird46){ * Bird46 b5 = (Bird46) a5;} */ } } class Animal46{ public void move() { System.out.println("动物们再行走"); } } class Cat46 extends Animal46{ public void move() { System.out.println("小猫在行走"); }//重写函数 //下面是小猫类特有的函数 public void catchMouse() { System.out.println("小猫是会抓老鼠的"); } } class Bird46 extends Animal46{ public void move() { System.out.println("小鸟在飞翔"); } }
注意:
(1)以上异常只有在强制类型转换的时候才会出现,也就是说“向下转型”存在隐患(编译通过了,到那时运行出错了)
(2)向上转型,只要编译通过了,运行一定不会出错.Animal46 a1 = new Cat46()
(3)向下转型,运行可能会出错,:Animal46 a1 = new Cat45();Bird46 b1 = (Bird46)a1;
5.如何避免向下转型出现的ClassCastException呢?
使用instanceof运算符可以避免出项上述情况,怎么用呢?
(1)格式:这个后面的数据类型是它在堆内存中的实际存储的数据类型。
(引用 instanceof 数据类型名)
(2)以上运算符的执行结果是布尔类型,结果可能是true/false
(3)关于运算结果true/false
假设:(a instanceof Animal)
true表示:a这个引用指向的对象是一个Animal类型
false表示:a这个引用指向的对象不是一个Animal类型
6.java规范中要求:在进行强制类型转换之前,建议采用instanceof运算符进行判断,避免ClassCastException异常的发生。
二、代码调试
快捷键:
F5:进入到该程序中
F6:下一步
F7:当前方法结束
F8:执行下一个断点
四、多态的作用
1.多态在实际开发的作用,以下以主人喂养宠物为例说明多态的作用:
(1)分析:主人喂养宠物这个场景要实现需要进行类型的抽象:
主人(类)
主人可以喂养宠物,所以主人有喂养的这个动作
宠物(类)
宠物可以吃东西,所以宠物有吃东西的这个动作
(2)面向对象编程的核心:定义好类,然后将类实例化为一个对象,给一个环境驱使一下,让各个对象之间协作起来形成一个系统
(3)多态的作用
先举个不使用多态的例子
package com.bjpowernode.java_learning; public class D47_2_EffectOfPolymorphic { public static void main(String[] args) { Master47 m1 = new Master47(); Cat47 c1 = new Cat47(); m1.feed(c1); Dog47 d1 = new Dog47(); m1.feed(d1); } } class Cat47{ public void eat() { System.out.println("小猫爱吃鱼"); } } class Dog47{ public void eat() { System.out.println("小狗爱吃骨头"); } } class Master47{ public void feed(Cat47 c) { c.eat(); } //函数重载一下,要是养小狗也得调用 public void feed(Dog47 d) { d.eat(); } }
从上面的例子可以看出来:这种方式没有使用java语言中的多态机制,存在的缺点:Master47的扩展力很差,因为只要加一个新的宠物,Maset47这个类就要添加新的方法。
我们补充几个概念:
提高程序的耦合度(解耦合),提高程序的扩展力(软件开发的一个很重要的目标)
我们日v行:面向抽象编程不要面向具体过程编程,面向抽象编程的好处是:耦合度低,扩展能力强。
package com.bjpowernode.java_learning; public class D47_3_PolymorphicExample { public static void main(String[] args) { Pet pDog = new Dog47_2(); Pet pCat = new Cat47_2(); Master47_2 m2 = new Master47_2(); m2.feed(pDog); m2.feed(pCat); //我们利用多态就可以做到随便养宠物,将宠物作为父类 } } class Pet { public void eat() { } } class Cat47_2 extends Pet { public void eat() { System.out.println("小猫还在吃鱼"); } } class Dog47_2 extends Pet { public void eat() { System.out.println("小狗还在吃骨头"); } } class Master47_2{ public void feed(Pet p) { p.eat(); } }
五、源码:
D47_1_polymorphic.java
D47_2_EffectOfPolymorphic.java
D47_3_PolymorphicExample.java
地址:
https://github.com/ruigege66/Java/blob/master/D47_1_polymorphic.java
https://github.com/ruigege66/Java/blob/master/D47_2_EffectOfPolymorphic.java
https://github.com/ruigege66/Java/blob/master/D47_3_PolymorphicExample.java
2.CSDN:https://blog.csdn.net/weixin_44630050(心悦君兮君不知-睿)
3.博客园:https://www.cnblogs.com/ruigege0000/
4.欢迎关注微信公众号:傅里叶变换,个人公众号,仅用于学习交流,后台回复”礼包“,获取大数据学习资料
Java连载47-多态基础语法、作用的更多相关文章
- Java学习笔记之---基础语法
Java学习笔记之---基础语法 一. Java中的命名规范 (一)包名 由多个单词组成时,所有字母小写(例如:onetwo) (二)类名和接口 由多个单词组成时,所有单词首字母大写(例如:OneTw ...
- JAVA企业级开发-xml基础语法&约束&解析(04)
一.什么是xml html:超文本标记语言.它主要是用来封装页面上要显示的数据,最后通过浏览器来解析html文件,然后把数据展示在浏览器上.同样我们可以使用JS和DOM技术对html文件进行解析和操作 ...
- Java连载26-方法(语法结构)
一.方法 1.返回值类型如果不是void,表示这个方法执行结束之后必须返回一个具体的数值,当方法执行结束的时候没有返回任何数值,编译器会报错,怎么返回值呢?并且要求“值”的数据类型必须和“方法的返回值 ...
- java学习笔记之基础语法(一)
1.java语言基础由关键字.标识符.注释.常量和变量.运算符.语句.函数和数组等组成. 2.1关键字 定义:被java语言赋予了特殊含义的单词 特点:关键字中所有的字母都是小写. 2.2用于定义数据 ...
- Java学习笔记之基础语法(数据类型)
8种基本数据类型 整型: byte[1字节] short[2字节] int[4字节] long[8字节] 1,四种整型之间的区别:申 ...
- java快速复习 一 基础语法
最近看很多算法书,比较不错的有不少都是java语言描述,所以用一天时间快速研究并整理java ,参考资料:java入门经典 Call this file "Example2.java&qu ...
- Java入门笔记 01-Java基础语法
一.数据类型和运算符 1.注释可以提高程序的可读性.可划分为 单行注释 // 多行注释 /.../ 文档注释 /**...*/ 2.标识符的命名规则: 标识符必须以字母.下划线_.美元符号$开头. 标 ...
- JAVA预科:Markdown基础语法
JAVA预科:Markdown语法 什么是Markdown?Markdown是一种轻量级的「标记语言」,通常为程序员群体所用,目前它已是全球最大的技术分享网站 GitHub 和技术问答网站 Stack ...
- java与C#的基础语法区别--持续更新
1.判断字符串是否相等 java : equals()比较的是对象的内容(区分字母的大小写格式),但是如果使用“==”比较两个对象时,比较的是两个对象的内存地址,所以不相等.即使它们内容相等,但是不同 ...
随机推荐
- VS2017创建的单元测试不支持顺序测试
问题:使用IDE创建的单元测试项目,标准引用是,导致不能添加顺序测试,复制其它项目的顺序测试文件进行编辑时,也会提示基于MSTest V2的测试不能用于顺序测试 解决办法: 移除自带的NU ...
- 新手学Html之JSP简介——入门(一)
1.JSP:动态网页 静态动态:是否随着时间地点.用户操作的改变而改变 动态网页需要用到 服务端脚本语言(JSP) 2.架构 CS:Client Server 不足: a.如果软件升级.那么全部软件都 ...
- java之this关键字和super关键字的区别
编号 区别点 this super 1 访问属性 访问本类中的属性,如果本类没有此 属性则从父类中继续查找 访问父类中的属性 2 调用方法 访问本类中的方法 直接访问父类中的方法 3 调用构造器 调用 ...
- SpringCloud gateway (史上最全)
疯狂创客圈 Java 分布式聊天室[ 亿级流量]实战系列之 -25[ 博客园 总入口 ] 前言 ### 前言 疯狂创客圈(笔者尼恩创建的高并发研习社群)Springcloud 高并发系列文章,将为大家 ...
- MIT / BSD / Apache / LGPL / Mozilla / GPL 区别
自由度:MIT > BSD > Apache > LGPL > Mozilla > GPL
- Java描述设计模式(09):装饰模式
本文源码:GitHub·点这里 || GitEE·点这里 一.生活场景 1.场景描述 孙悟空有七十二般变化,他的每一种变化都给他带来一种附加的本领.他变成鱼儿时,就可以到水里游泳:他变成鸟儿时,就可以 ...
- Idea2019激活码
此教程仅用作个人学习,请勿用于商业获利,造成后果自负!!! 此教程已支持最新2019.2版本 此教程实时更新,请放心使用:如果有新版本出现猪哥都会第一时间尝试激活: idea官网下载地址:http:/ ...
- Linux之自动化部署
No.1 自动化部署git项目 一一一一一一一一一一一一一一一一一一一一一一一一一一一一一一一一一一一一一一一一一一一一一一一一一一一一一一一一一一一一一一一一一一一一一一一一一一一一一一一一一一一一 ...
- JAVA集合框架(二)-List和Set
List的常用实现类 list集合是有序的,顺序即添加的顺序,元素是可重复的. ArrayList LinkedList Vector ArrayList 底层基于数组实现.在add元素的过程中,如果 ...
- Python 一键获取百度网盘提取码
该 GIF 图来自于官网,文末有给出链接. 描述 依托于百度网盘巨大的的云存储空间,绝大数人会习惯性的将一些资料什么的存储到上面,但是有的私密链接需要提取码,但是让每个想下载私密资源的人记住每一个提取 ...