Java:多态的概念和案例实现
一、多态的概念
多态性是指同一个操作作用于某一类对象,可有不同的解释,产生不同的执行结果
多态存在的三个必要条件
需要存在继承或实现关系
同样的方法调用而执行不同的操作、运行不同代码(重写)
在运行时父类或者接口的引用变量可以引用其子类的对象
多态的作用
多态通过分离做什么和怎么做,从一个 角度将接口和实现进行分离
多态消除了类型之间的耦合关系
多态的存在提高了程序的拓展性和后期的可维护性
新建一个工程
现在有一个class Animal 这样的类,做一个public void eat 的方法
我们做一个class去继承Animal,去重写里面的方法,重写的时候,我们还是用system.out来打印
就满足了多态的三个条件之一需要存在继承或实现关系
在运行时父类或者接口的引用变量可以引用其子类的对象
我们把父类的引用指到了子类的具体的对象
Animal an1 = new Dog();
运行结果
继承得有,重写得有,父类的引用变量引用子类的对象
二、对象的上下转型
由子类转型成父类,在继承图上是向上移动的,一般称为向上转型
向上转型是从一个较专用类型向通用类型转换,所以总是安全的,也就是说,子类是父类的超集
向上转型过程中,类接口中唯一可能发生的事情是丢失方法,而不是获取方法
与之相反的操作是向下转型,不安全(可能需要instanceof操作符协助)
多态有一个特殊的概念就是 父类的引用变量会引用子类的对象
就咱们刚才写的代码就是向上转型
我原型是dog,我把它转成了animal,实际上就像Animal an1 = (Animal)new Dog();
把子类往父类去转就是向上转型
向上转型是从一个较专用类型向通用类型转换,所以总是安全的,也就是说,子类是父类的超集
比如dog就是很专用的对于Animal来说,为什么dog是Animal 的超集呢?因为我把Animal里面能继承的东西都给继承过来了,会加一些它独有的方法,比如咬人
错误提示The method sleep() is undefined for the type Animal
找不到
我们dog本身带着sleep往上转的时候就不行
那如果我们现在有一个Dog dog = new Dog();
这时候调用dog.sleep() 是OK的
运行结果
也就是向上转型会安全,安全体现在运行的过程
编译的时候,外加的函数如果消失的话,编译就不允许你通过,所以也是一种意义上的安全,不安全应该发生在运行的过程
与之相反的操作就是向下转型,这是很不安全的
假如我定义了一个cat出来
错误提示:Type mismatch: cannot convert from Animal to Cat
硬转一下Cat cat = (Cat)an1;
调用cat.eat();看看会不会崩,或者报错
运行结果
Exception in thread "main" java.lang.ClassCastException: Dog cannot be cast to Cat
at Test.main(Test.java:38)
因为an1只是一个引用,真正指向的是dog对象,
你不能把dog强制转换成cat
instanceof运算符用来在运行时通过返回值来指出对象是否是特定类或者是它的子类的一个实例
用法:
result = object instanceof class
result:布尔类型
object :必选项,任意对象表达式
class:必选项,任意已定义的对象类
说明:如果object 是class 或其子类的一个实例,则instanceof运算符返回true,如果不是或者object 是null,则返回false
典型的使用场合
在对对象做下转型之前,没有其他有关对象信息时务必使用instanceof来判断一下,以避免抛出ClassCastException异常
现实开发中我们会用instanceof关键字判断 ,aa一但有输出,就是ok的
运行一下
发现animal 没有输出,因为an2不是cat
如果我们改成an2 呢?
运行结果
三、多态应用
简单来说,多态是具有表现多种形式能力的特征
同一个实现接口,使用不同的实例而执行不同操作
新建一个工程
打印需要打印内容 public void print(String contex)
重写的话需要把Stiring contex加进来 第32行
学校再来一个安装方法 第7行
最后在主函数中打印 一个学校安装了一个打印机
这是一个学校 School s = new School();
彩色 CaiSeDayin c = new CaiSeDayin();
school里面的彩色打印等于彩 s.cy = c;
调用school里面的print s.print("lizhaopeng");
运行结果
那如果要黑色打印呢? HeiBaiDayin h = new HeiBaiDayin();
s.hy= h;
s.print("李兆鹏");
运行结果
全是彩色
修改一下 第15行
运行结果
再加上安装函数
运行结果
16行和53行有错误
即使你把16行的hy.print(contex);改成cy.print(contex),运行结果变成都是彩印
这样就特别混乱,代码容易混,这时候就需要我们的多态
那么多态怎么用呢?
我们学校不管彩色还是黑色,我们学校只管public Dayin dayinji;
至于是什么样的打印机,我不关心都可以
运行结果
我们再加一个针式打印机
做到添加一个打印机,添加一个类,用的时候给他设置进去就可以了
运行结果
Java:多态的概念和案例实现相关推荐
- Java多态的概念、优点和用法
1. 多态的概念 Java中面向对象有三大特性:封装.继承和多态. Java中的多态是什么,表现在哪里? 允许不同类的对象对同一消息做出响应.即同一消息可以根据发送对象 ...
- java多态的概念_java中多态是什么?概念详解
对于java中的多态你是怎样理解的呢?很多人表示,自己对于多态的概念不是很清楚,那么下面就让我们一起来详细的了解一下吧. 1.什么是多态? 多态简单的来说就是一种事物的多种存在形态. 在面向对象语言当 ...
- Java多态的概念及简单实现
1.多态 1.1.概念 多态性是指同一个操作用于某一对象,可以有不同的解释,产生不同的执行结果 1.2.多态存在的三个必要条件 (1)需要存在继承和实现关系 (2)同样的方法调用而执行不同操作.运行不 ...
- java多态(java多态的概念)
简述什么是JAVA中的多态 父类的引用可以引用子类的对象.换句话说,如果有一个类继承或实现了某个类或接口,那么被继承或实现的类或接口可以创建那一个类的对象,这样程序就会变得很灵活. java中多态的定 ...
- java多态的概念_Java基本概念:多态
一.简介 描述: 多态性是面向对象编程中的一个重要特性,主要是用来实现动态联编的.换句话说,就是程序的最终状态只有在执行过程中才被决定,而非在编译期间就决定了.这对于大型系统来说能提高系统的灵活性和扩 ...
- java多态的概念_java中多态概念、实现原理详解
一.什么是多态? 1.多态的定义 指允许不同类的对象对同一消息做出响应.即同一消息可以根据发送对象的不同而采用多种不同的行为方式(发送消息就是函数调用) 2.多态的作用 消除类型之间的耦合关系 3.多 ...
- 新手福利——理解java多态的概念和作用
多态是面向对象的重要特性,简单点说:"一个接口,多种实现",就是同一种事物表现出的多种形态. 编程其实就是一个将具体世界进行抽象化的过程,多态就是抽象化的一种体现,把一系列具体事物 ...
- 什么是Java多态?如何实现Java多态?
java多态这个概念在同学们深入学习java的时候就会被提出,很多同学并不知道是什么意思,如何实现.今天小千就来给大家介绍一下什么是java多态和java如何实现多态. 什么是多态? 指允许不同类的对 ...
- java 多态_Java 多态
Java多态,在之前的向上转型的文章中已经介绍了使用场景和为什么要通过向上转型实现运行时多态,请先看文章:张舰:Java 向上转型和向下转型 这篇文章主要是总结一下Java多态的概念,具体的例子请参考 ...
最新文章
- java 内存泄露对象排查_记录一次 java内存泄漏的排查
- spring配置详解-属性注入(p名称空间SPEL表达式)
- 网络经济与企业管理(第 1 章:企业管理概论)
- jquery级试题_腾讯2020前端面试题含答案解析
- Java实现文件夹打包
- linux python怎么用_【Python for Linux怎么用】Python for Linux好不好_使用技巧-ZOL软件百科...
- Python编程 从入门到实践 第2版
- android课程设计多彩的霓虹,Android-自定义TextView(彩色字体与霓虹灯字体以及TextView的多项字体效果)...
- 一阶广义差分模型_计量经济学习题第5章 自相关性
- sklearn中分割数据集的函数
- lms全称是什么意思_lms是什么意思?
- 网络安全绝地求生-面试题
- android wi-fi_如何在Android上限制计量Wi-Fi网络的背景数据
- 学生体育运动主题网页设计——兵乓球国乒网(纯HTML+CSS代码)
- 里恩临床试验电子数据采集系统(EDC)介绍
- 计算机音乐春分秋分,春分秋分是怎么确定的
- 【t076】竞赛排名
- Python 安装包管理工具 pip
- word 中 ctrl+v不能使用问题
- oracle数据文件被误删或损坏故障处理