java 多态二
一 多态-转型
多态的转型分为向上转型与向下转型两种:
向上转型:当有子类对象赋值给一个父类引用时,便是向上转型,多态本身就是向上转型的过程。
使用格式:
父类类型 变量名 = new 子类类型();
如:Person p = new Student();
向下转型:一个已经向上转型的子类对象可以使用强制类型转换的格式,将父类引用转为子类引用,
这个过程是向下转型。如果是直接创建父类对象,是无法向下转型的!
使用格式:
子类类型 变量名 = (子类类型) 父类类型的变量;
如:Student stu = (Student) p; //变量p 实际上指向Student对象
二 多态的好处与弊端
当父类的引用指向子类对象时,就发生了向上转型,即把子类类型对象转成了父类类型。向上转型的
好处是隐藏了子类类型,提高了代码的扩展性。
但向上转型也有弊端,只能使用父类共性的内容,而无法使用子类特有功能,功能有限制。看如下代码
- //描述动物类,并抽取共性eat方法
- abstract class Animal {
- abstract void eat();
- }
- // 描述狗类,继承动物类,重写eat方法,增加lookHome方法
- class Dog extends Animal {
- void eat() {
- System.out.println("啃骨头");
- }
- void lookHome() {
- System.out.println("看家");
- }
- }
- // 描述猫类,继承动物类,重写eat方法,增加catchMouse方法
- class Cat extends Animal {
- void eat() {
- System.out.println("吃鱼");
- }
- void catchMouse() {
- System.out.println("抓老鼠");
- }
- }
- public class Test {
- public static void main(String[] args) {
- Animal a = new Dog(); //多态形式,创建一个狗对象
- a.eat(); // 调用对象中的方法,会执行狗类中的eat方法
- // a.lookHome();//使用Dog类特有的方法,需要向下转型,不能直接使用
- // 为了使用狗类的lookHome方法,需要向下转型
- // 向下转型过程中,可能会发生类型转换的错误,即ClassCastException异常
- // 那么,在转之前需要做健壮性判断
- if( !a instanceof Dog){ // 判断当前对象是否是Dog类型
- System.out.println("类型不匹配,不能转换");
- return;
- }
- Dog d = (Dog) a; //向下转型
- d.lookHome();//调用狗类的lookHome方法
- }
- }
总结:
什么时候使用向上转型:
当不需要面对子类类型时,通过提高扩展性,或者使用父类的功能就能完成相应的操作,
这时就可以使用向上转型。
如:Animal a = new Dog();
a.eat();
什么时候使用向下转型
当要使用子类特有功能时,就需要使用向下转型。
如:Dog d = (Dog) a; //向下转型
d.lookHome();//调用狗类的lookHome方法
向下转型的好处:可以使用子类特有功能。
弊端是:需要面对具体的子类对象;在向下转型时容易发生ClassCastException类型转换异常。在转换之前必须做类型判断。
如:if( !a instanceof Dog){…}
三 多态举例
例一:毕老师和毕姥爷的故事
- /*
- 描述毕老师和毕姥爷,
- 毕老师拥有讲课和看电影功能
- 毕姥爷拥有讲课和钓鱼功能
- */
- class 毕姥爷 {
- void 讲课() {
- System.out.println("政治");
- }
- void 钓鱼() {
- System.out.println("钓鱼");
- }
- }
- // 毕老师继承了毕姥爷,就有拥有了毕姥爷的讲课和钓鱼的功能,
- // 但毕老师和毕姥爷的讲课内容不一样,因此毕老师要覆盖毕姥爷的讲课功能
- class 毕老师 extends 毕姥爷 {
- void 讲课() {
- System.out.println("Java");
- }
- void 看电影() {
- System.out.println("看电影");
- }
- }
- public class Test {
- public static void main(String[] args) {
- // 多态形式
- 毕姥爷 a = new 毕老师(); // 向上转型
- a.讲课(); // 这里表象是毕姥爷,其实真正讲课的仍然是毕老师,因此调用的也是毕老师的讲课功能
- a.钓鱼(); // 这里表象是毕姥爷,但对象其实是毕老师,而毕老师继承了毕姥爷,即毕老师也具有钓鱼功能
- // 当要调用毕老师特有的看电影功能时,就必须进行类型转换
- 毕老师 b = (毕老师) a; // 向下转型
- b.看电影();
- }
- }
例二:
定义一个父类Animal eat方法 , 定义两个子类 Dog 特有方法keepHome , Cat 特有方法 catchMouse ;
并且 重写eat方法
测试类中写一个方法,参数列表有一个参数Animla类型,
要求: 调用该方法分别传递Dog对象 和Cat 对象, 使用instanceof进行强转后调用eat,和他们的特有方法
- public abstract class Animal {
- public abstract void eat();
- }
- public class Cat extends Animal {
- @Override
- public void eat() {
- System.out.println("猫吃鱼");
- }
- public void catchMouse(){
- System.out.println("猫捉老鼠");
- }
- }
- public class Dog extends Animal {
- @Override
- public void eat() {
- System.out.println("狗吃骨头");
- }
- public void keepHome(){
- System.out.println("狗看家");
- }
- }
- public static void method(Animal a){
- if(a instanceof Cat){
- Cat c = (Cat)a;
- c.eat();
- c.catchMouse();
- }else if(a instanceof Dog){
- Dog d = (Dog)a;
- d.eat();
- d.keepHome();
- }
- }
- Cat c = new Cat();
- Dog d = new Dog();
- method(c);
- System.out.println("----------");
- method(d);
- System.out.println("==========");
java 多态二的更多相关文章
- java学习(二)多态中成员变量详解
今天我总结了一下java多态中成员变量的赋值与调用 举一个我当初做过的小案例: class Fu{ int num; void show(){} } class Zi extends Fu{ //in ...
- Java多态(二)
public class ExtendsTest { public static void main(String[] args) { A a1 = new A(); A a2 = new B(); ...
- Java学习笔记二十六:Java多态中的引用类型转换
Java多态中的引用类型转换 引用类型转换: 1.向上类型转换(隐式/自动类型转换),是小类型到大类型的转换: 2.向下类型转换(强制类型转换),是大类型到小类型的转换: 3.instanceof运算 ...
- C++和java多态的区别
C++和java多态的区别 分类: Java2015-06-04 21:38 2人阅读 评论(0) 收藏 举报 转载自:http://www.cnblogs.com/plmnko/archive ...
- 关于java多态的理解
要理解多态,就必须有一个大的理解方向,不然很容易绕进去. 首先知道多态的释义:多态性是指一个名词可以有多种语义. 对于java的多态性学习者来说,就是必须要知道多个同名方法在不同情况下的使用规则. j ...
- Java经验杂谈(2.对Java多态的理解)
多态是面向对象的重要特性之一,我试着用最简单的方式解释Java多态: 要正确理解多态,我们需要明确如下概念:・定义类型和实际类型・重载和重写・编译和运行 其中实际类型为new关键字后面的类型. 重载发 ...
- 对java多态的理解
java多态,如何理解父类引用指向子类对象 要理解多态性,首先要知道什么是“向上转型”. 我定义了一个子类Cat,它继承了Animal类,那么后者就是前者是父类.我可以通过 Cat c = new C ...
- 20175212童皓桢 Java实验二-面向对象程序设计实验报告
20175212童皓桢 Java实验二-面向对象程序设计实验报告 实验内容 初步掌握单元测试和TDD 理解并掌握面向对象三要素:封装.继承.多态 初步掌握UML建模 熟悉S.O.L.I.D原则 了解设 ...
- Java多态-如何理解父类引用指向子类对象
java多态,如何理解父类引用指向子类对象 要理解多态性,首先要知道什么是“向上转型”. 我定义了一个子类Cat,它继承了Animal类,那么后者就是前者是父类.我可以通过 Cat c = new ...
随机推荐
- CCNA - Part7:网络层 - ICMP 应该是你最熟悉的协议了
ICMP 协议 在之前网络层的介绍中,我们知道 IP 提供一种无连接的.尽力而为的服务.这就意味着无法进行流量控制与差错控制.因此在 IP 数据报的传输过程中,出现各种的错误是在所难免的,为了通知源主 ...
- Python Ethical Hacking - BACKDOORS(5)
File Download: A file is a series of characters. Therefore to transfer a file we need to: 1. Read th ...
- 实践使用nodejs获取用户真实IP?
先上代码 var http = require('http') var server = http.createServer(function (req,res) { console.log(req. ...
- NVIDIA GPU Volta架构简述
NVIDIA GPU Volta架构简述 本文摘抄自英伟达Volta架构官方白皮书:https://www.nvidia.com/content/dam/en-zz/Solutions/Data-Ce ...
- Bing每日壁纸API
懒人直接出图 https://www.shadow-forum.com/api/bing/bing.php API API地址: https://bing.biturl.top 调用方式: HTTP ...
- CentOS 7配置网卡信息,并设置yum为阿里云的镜像源
一.问题场景 使用virtualbox创建的centos 7版本的linux虚拟机,使用ping mirrors.aliyun.com有返回,但是wget -O /etc/yum.repos.d/ep ...
- centos7+jexus5.8.3部署ASP.NET的MVC项目
1.在centos7终端以root权限安装jexus5.8.3的独立版 命令:curl https://jexus.org/release/x64/install.sh|sh 2.跳转到目录/usr/ ...
- windy数(数位dp)
https://www.luogu.com.cn/blog/virus2017/shuweidp https://www.luogu.com.cn/problem/P2657 #include < ...
- 基于Bilateral Attention和Pyramid Filling Block的图像修复方法
One-Stage Inpainting with Bilateral Attention and Pyramid Filling Block 论文链接:https://arxiv.org/abs/1 ...
- SYN 攻击原理及解决方法
原理SYN foold攻击主要针对tcp通信三次握手期间做的手脚,所以要弄懂这个攻击的原理我们首先必须知道tcp三次握手的详细过程 由上图可知tcp三次握手顾名思义要经过三个步骤,这三个步骤分别是 客 ...