发布于2021-11-21 21:16 阅读(986) 评论(0) 点赞(28) 收藏(5)
多态性是指同一个操作作用于某一类对象,可有不同的解释,产生不同的执行结果
多态存在的三个必要条件
需要存在继承或实现关系
同样的方法调用而执行不同的操作、运行不同代码(重写)
在运行时父类或者接口的引用变量可以引用其子类的对象
多态的作用
多态通过分离做什么和怎么做,从一个 角度将接口和实现进行分离
多态消除了类型之间的耦合关系
多态的存在提高了程序的拓展性和后期的可维护性
新建一个工程
现在有一个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;
至于是什么样的打印机,我不关心都可以
运行结果
我们再加一个针式打印机
做到添加一个打印机,添加一个类,用的时候给他设置进去就可以了
运行结果
作者:咿呀咿呀哟
链接:http://www.javaheidong.com/blog/article/326685/43aacbc88250b3084cbc/
来源:java黑洞网
任何形式的转载都请注明出处,如有侵权 一经发现 必将追究其法律责任
昵称:
评论内容:(最多支持255个字符)
---无人问津也好,技不如人也罢,你都要试着安静下来,去做自己该做的事,而不是让内心的烦躁、焦虑,坏掉你本来就不多的热情和定力
Copyright © 2018-2021 java黑洞网 All Rights Reserved 版权所有,并保留所有权利。京ICP备18063182号-2
投诉与举报,广告合作请联系vgs_info@163.com或QQ3083709327
免责声明:网站文章均由用户上传,仅供读者学习交流使用,禁止用做商业用途。若文章涉及色情,反动,侵权等违法信息,请向我们举报,一经核实我们会立即删除!