一 多态-转型

多态的转型分为向上转型与向下转型两种:

向上转型:当有子类对象赋值给一个父类引用时,便是向上转型,多态本身就是向上转型的过程。

使用格式:

  父类类型  变量名 = new 子类类型();

  如:Person p = new Student();

向下转型:一个已经向上转型的子类对象可以使用强制类型转换的格式,将父类引用转为子类引用,

这个过程是向下转型。如果是直接创建父类对象,是无法向下转型的!

使用格式:

  子类类型 变量名 = (子类类型) 父类类型的变量;

  如:Student stu = (Student) p;  //变量p 实际上指向Student对象

二 多态的好处与弊端

  当父类的引用指向子类对象时,就发生了向上转型,即把子类类型对象转成了父类类型。向上转型的

好处是隐藏了子类类型,提高了代码的扩展性。

  但向上转型也有弊端,只能使用父类共性的内容,而无法使用子类特有功能,功能有限制。看如下代码

  1. //描述动物类,并抽取共性eat方法
  2. abstract class Animal {
  3. abstract void eat();
  4. }
  5.  
  6. // 描述狗类,继承动物类,重写eat方法,增加lookHome方法
  7. class Dog extends Animal {
  8. void eat() {
  9. System.out.println("啃骨头");
  10. }
  11.  
  12. void lookHome() {
  13. System.out.println("看家");
  14. }
  15. }
  16.  
  17. // 描述猫类,继承动物类,重写eat方法,增加catchMouse方法
  18. class Cat extends Animal {
  19. void eat() {
  20. System.out.println("吃鱼");
  21. }
  22.  
  23. void catchMouse() {
  24. System.out.println("抓老鼠");
  25. }
  26. }
  27.  
  28. public class Test {
  29. public static void main(String[] args) {
  30. Animal a = new Dog(); //多态形式,创建一个狗对象
  31. a.eat(); // 调用对象中的方法,会执行狗类中的eat方法
  32. // a.lookHome();//使用Dog类特有的方法,需要向下转型,不能直接使用
  33.  
  34. // 为了使用狗类的lookHome方法,需要向下转型
  35. // 向下转型过程中,可能会发生类型转换的错误,即ClassCastException异常
  36. // 那么,在转之前需要做健壮性判断
  37. if( !a instanceof Dog){ // 判断当前对象是否是Dog类型
  38. System.out.println("类型不匹配,不能转换");
  39. return;
  40. }
  41. Dog d = (Dog) a; //向下转型
  42. d.lookHome();//调用狗类的lookHome方法
  43. }
  44. }

总结:

什么时候使用向上转型:

  当不需要面对子类类型时,通过提高扩展性,或者使用父类的功能就能完成相应的操作,

这时就可以使用向上转型。

  如:Animal a = new Dog();

    a.eat();

什么时候使用向下转型

  当要使用子类特有功能时,就需要使用向下转型。

  如:Dog d = (Dog) a; //向下转型

  d.lookHome();//调用狗类的lookHome方法

向下转型的好处:可以使用子类特有功能。

弊端是:需要面对具体的子类对象;在向下转型时容易发生ClassCastException类型转换异常。在转换之前必须做类型判断。

如:if( !a instanceof Dog){…}

三 多态举例

例一:毕老师和毕姥爷的故事

  1. /*
  2. 描述毕老师和毕姥爷,
  3. 毕老师拥有讲课和看电影功能
  4. 毕姥爷拥有讲课和钓鱼功能
  5. */
  6. class 毕姥爷 {
  7. void 讲课() {
  8. System.out.println("政治");
  9. }
  10.  
  11. void 钓鱼() {
  12. System.out.println("钓鱼");
  13. }
  14. }
  15.  
  16. // 毕老师继承了毕姥爷,就有拥有了毕姥爷的讲课和钓鱼的功能,
  17. // 但毕老师和毕姥爷的讲课内容不一样,因此毕老师要覆盖毕姥爷的讲课功能
  18. class 毕老师 extends 毕姥爷 {
  19. void 讲课() {
  20. System.out.println("Java");
  21. }
  22.  
  23. void 看电影() {
  24. System.out.println("看电影");
  25. }
  26. }
  27.  
  28. public class Test {
  29. public static void main(String[] args) {
  30. // 多态形式
  31. 毕姥爷 a = new 毕老师(); // 向上转型
  32. a.讲课(); // 这里表象是毕姥爷,其实真正讲课的仍然是毕老师,因此调用的也是毕老师的讲课功能
  33. a.钓鱼(); // 这里表象是毕姥爷,但对象其实是毕老师,而毕老师继承了毕姥爷,即毕老师也具有钓鱼功能
  34.  
  35. // 当要调用毕老师特有的看电影功能时,就必须进行类型转换
  36. 毕老师 b = (毕老师) a; // 向下转型
  37. b.看电影();
  38. }
  39. }

例二:

定义一个父类Animal eat方法 , 定义两个子类 Dog 特有方法keepHome , Cat 特有方法 catchMouse ;

并且 重写eat方法
测试类中写一个方法,参数列表有一个参数Animla类型,
要求: 调用该方法分别传递Dog对象 和Cat 对象, 使用instanceof进行强转后调用eat,和他们的特有方法

  1. public abstract class Animal {
  2. public abstract void eat();
  3. }
  1. public class Cat extends Animal {
  2. @Override
  3. public void eat() {
  4. System.out.println("猫吃鱼");
  5.  
  6. }
  7. public void catchMouse(){
  8. System.out.println("猫捉老鼠");
  9. }
  10. }
  1. public class Dog extends Animal {
  2. @Override
  3. public void eat() {
  4. System.out.println("狗吃骨头");
  5. }
  6. public void keepHome(){
  7. System.out.println("狗看家");
  8. }
  9. }
  1. public static void method(Animal a){
  2. if(a instanceof Cat){
  3. Cat c = (Cat)a;
  4. c.eat();
  5. c.catchMouse();
  6. }else if(a instanceof Dog){
  7. Dog d = (Dog)a;
  8. d.eat();
  9. d.keepHome();
  10. }
  11. }
  1.      Cat c = new Cat();
  2. Dog d = new Dog();
  3. method(c);
  4. System.out.println("----------");
  5. method(d);
  6. System.out.println("==========");

java 多态二的更多相关文章

  1. java学习(二)多态中成员变量详解

    今天我总结了一下java多态中成员变量的赋值与调用 举一个我当初做过的小案例: class Fu{ int num; void show(){} } class Zi extends Fu{ //in ...

  2. Java多态(二)

    public class ExtendsTest { public static void main(String[] args) { A a1 = new A(); A a2 = new B(); ...

  3. Java学习笔记二十六:Java多态中的引用类型转换

    Java多态中的引用类型转换 引用类型转换: 1.向上类型转换(隐式/自动类型转换),是小类型到大类型的转换: 2.向下类型转换(强制类型转换),是大类型到小类型的转换: 3.instanceof运算 ...

  4. C++和java多态的区别

    C++和java多态的区别 分类: Java2015-06-04 21:38 2人阅读 评论(0) 收藏 举报  转载自:http://www.cnblogs.com/plmnko/archive ...

  5. 关于java多态的理解

    要理解多态,就必须有一个大的理解方向,不然很容易绕进去. 首先知道多态的释义:多态性是指一个名词可以有多种语义. 对于java的多态性学习者来说,就是必须要知道多个同名方法在不同情况下的使用规则. j ...

  6. Java经验杂谈(2.对Java多态的理解)

    多态是面向对象的重要特性之一,我试着用最简单的方式解释Java多态: 要正确理解多态,我们需要明确如下概念:・定义类型和实际类型・重载和重写・编译和运行 其中实际类型为new关键字后面的类型. 重载发 ...

  7. 对java多态的理解

    java多态,如何理解父类引用指向子类对象 要理解多态性,首先要知道什么是“向上转型”. 我定义了一个子类Cat,它继承了Animal类,那么后者就是前者是父类.我可以通过 Cat c = new C ...

  8. 20175212童皓桢 Java实验二-面向对象程序设计实验报告

    20175212童皓桢 Java实验二-面向对象程序设计实验报告 实验内容 初步掌握单元测试和TDD 理解并掌握面向对象三要素:封装.继承.多态 初步掌握UML建模 熟悉S.O.L.I.D原则 了解设 ...

  9. Java多态-如何理解父类引用指向子类对象

    java多态,如何理解父类引用指向子类对象 要理解多态性,首先要知道什么是“向上转型”. 我定义了一个子类Cat,它继承了Animal类,那么后者就是前者是父类.我可以通过   Cat c = new ...

随机推荐

  1. CCNA - Part7:网络层 - ICMP 应该是你最熟悉的协议了

    ICMP 协议 在之前网络层的介绍中,我们知道 IP 提供一种无连接的.尽力而为的服务.这就意味着无法进行流量控制与差错控制.因此在 IP 数据报的传输过程中,出现各种的错误是在所难免的,为了通知源主 ...

  2. 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 ...

  3. 实践使用nodejs获取用户真实IP?

    先上代码 var http = require('http') var server = http.createServer(function (req,res) { console.log(req. ...

  4. NVIDIA GPU Volta架构简述

    NVIDIA GPU Volta架构简述 本文摘抄自英伟达Volta架构官方白皮书:https://www.nvidia.com/content/dam/en-zz/Solutions/Data-Ce ...

  5. Bing每日壁纸API

    懒人直接出图 https://www.shadow-forum.com/api/bing/bing.php API API地址: https://bing.biturl.top 调用方式: HTTP ...

  6. CentOS 7配置网卡信息,并设置yum为阿里云的镜像源

    一.问题场景 使用virtualbox创建的centos 7版本的linux虚拟机,使用ping mirrors.aliyun.com有返回,但是wget -O /etc/yum.repos.d/ep ...

  7. centos7+jexus5.8.3部署ASP.NET的MVC项目

    1.在centos7终端以root权限安装jexus5.8.3的独立版 命令:curl https://jexus.org/release/x64/install.sh|sh 2.跳转到目录/usr/ ...

  8. windy数(数位dp)

    https://www.luogu.com.cn/blog/virus2017/shuweidp https://www.luogu.com.cn/problem/P2657 #include < ...

  9. 基于Bilateral Attention和Pyramid Filling Block的图像修复方法

    One-Stage Inpainting with Bilateral Attention and Pyramid Filling Block 论文链接:https://arxiv.org/abs/1 ...

  10. SYN 攻击原理及解决方法

    原理SYN foold攻击主要针对tcp通信三次握手期间做的手脚,所以要弄懂这个攻击的原理我们首先必须知道tcp三次握手的详细过程 由上图可知tcp三次握手顾名思义要经过三个步骤,这三个步骤分别是 客 ...