Java基础十一--多态

一、多态定义

简单说:就是一个对象对应着不同类型.

多态在代码中的体现:
父类或者接口的引用指向其子类的对象。

  1. /*
  2.  
  3. 对象的多态性。
  4.  
  5. class 动物
  6. {}
  7.  
  8. class 猫 extends 动物
  9. {}
  10.  
  11. class 狗 extends 动物
  12. {}
  13.  
  14. 猫 x = new 猫();
  15.  
  16. 动物 x = new 猫();//一个对象,两种形态。
  17.  
  18. 猫这类事物即具备者猫的形态,又具备着动物的形态。
  19. 这就是对象的多态性。
  20.  
  21. 简单说:就是一个对象对应着不同类型.
  22.  
  23. 27 多态在代码中的体现:
  24. 28 父类或者接口的引用指向其子类的对象。
  25.  
  26. 多态的好处:
  27. 提高了代码的扩展性,前期定义的代码可以使用后期的内容。
  28.  
  29. 多态的弊端:
  30. 前期定义的内容不能使用(调用)后期子类的特有内容。通过向下转型来解决。
  31.  
  32. 多态的前提:
  33. 1,必须有关系,继承,实现。(实现是特殊的继承)
  34. 2,要有覆盖。
  35.  
  36. */
  37.  
  38. abstract class Animal
  39. {
  40. abstract void eat();
  41.  
  42. }
  43.  
  44. class Dog extends Animal
  45. {
  46. void eat()
  47. {
  48. System.out.println("啃骨头");
  49. }
  50. void lookHome()
  51. {
  52. System.out.println("看家");
  53. }
  54. }
  55.  
  56. class Cat extends Animal
  57. {
  58. void eat()
  59. {
  60. System.out.println("吃鱼");
  61. }
  62. void catchMouse()
  63. {
  64. System.out.println("抓老鼠");
  65. }
  66. }
  67.  
  68. class Pig extends Animal
  69. {
  70. void eat()
  71. {
  72. System.out.println("饲料");
  73. }
  74. void gongDi()
  75. {
  76. System.out.println("拱地");
  77. }
  78. }
  79.  
  80. class DuoTaiDemo
  81. {
  82. public static void main(String[] args)
  83. {
  84.  
  85. // Cat c = new Cat();
  86. // c.eat();
  87. // c.catchMouse();
  88.  
  89. 98 Animal a = new Cat(); //自动类型提升,猫对象提升了动物类型。但是特有功能无法s访问。
  90. 99 //作用就是限制对特有功能的访问。
  91. 100 //专业讲:向上转型。将子类型隐藏。就不用使用子类的特有方法。
  92.  
  93. // a.eat();
  94.  
  95. //如果还想用具体动物猫的特有功能。
  96. //你可以将该对象进行向下转型。
  97. 107 // Cat c = (Cat)a;//向下转型的目的是为了使用子类中的特有方法。
  98. // c.eat();
  99. // c.catchMouse();
  100.  
  101. // 注意:对于转型,自始自终都是子类对象在做着类型的变化。
  102. // Animal a1 = new Dog();
  103. // Cat c1 = (Cat)a1;//ClassCastException
  104.  
  105. /*
  106. Cat c = new Cat();
  107.  
  108. // Dog d = new Dog();
  109.  
  110. // c.eat();
  111. method(c);
  112. // method(d);
  113. // method(new Pig());
  114. */
  115.  
  116. method(new Dog());
  117.  
  118. }
  119.  
  120. public static void method(Animal a)//Animal a = new Dog();
  121. {
  122. a.eat();
  123.      //解决类型匹配问题的时候,我们就可以判断一下
  124. 135 if(a instanceof Cat)//instanceof:用于判断对象的具体类型。只能用于引用数据类型判断
  125. 136 // //通常在向下转型前用于健壮性的判断。
  126.  
  127. {
  128. Cat c = (Cat)a;
  129. c.catchMouse();
  130. }
  131. else if(a instanceof Dog)
  132. {
  133. Dog d = (Dog)a;
  134. d.lookHome();
  135. }
  136. else
  137. {
  138.  
  139. }
  140.  
  141. }
  142. /*
  143. public static void method(Cat c)
  144. {
  145. c.eat();
  146. }
  147. public static void method(Dog d)
  148. {
  149.  
  150. }
  151. */
  152. }

向上转型:父类引用指向子类对象。子类的特有功能无法访问。

向下转型:子类引用指向父类对象。

  1. Animal a = new Cat(); //自动类型提升,猫对象提升了动物类型。但是特有功能无法s访问。
  2. //作用就是限制对特有功能的访问。
  3. //专业讲:向上转型。将子类型隐藏。就不用使用子类的特有方法。
  4.  
  5. Cat c = (Cat)a;//向下转型的目的是为了使用子类中的特有方法。

在实际应用中,向上转型便于代码扩展(之前写的代码以后能用,只有继承或者实现基类了的),但是要用到子类特有的功能的时候,必须向下转型。

很多时候我们向上转型为Object类,当用到自己特有功能的时候,我们向下转型转回来。

二、多态生活实例

  1. /*
  2. 毕老师和毕姥爷的故事。
  3. */
  4.  
  5. class 毕姥爷
  6. {
  7. void 讲课()
  8. {
  9. System.out.println("管理");
  10. }
  11. void 钓鱼()
  12. {
  13. System.out.println("钓鱼");
  14. }
  15. }
  16.  
  17. class 毕老师 extends 毕姥爷
  18. {
  19. void 讲课()
  20. {
  21. System.out.println("Java");
  22. }
  23. void 看电影()
  24. {
  25. System.out.println("看电影");
  26. }
  27. }
  28.  
  29. class DuoTaiDemo2
  30. {
  31. public static void main(String[] args)
  32. { //原来
  33. // 毕老师 x = new 毕老师();
  34. // x.讲课();
  35. // x.看电影();
  36.      //多态
  37. 毕姥爷 x = new 毕老师();
  38. x.讲课(); //这里讲的是Java的内容,Java把管理学覆盖了
  39. x.钓鱼();
  40.  
  41. 毕老师 y = (毕老师)x;//ClassCastException
  42. y.看电影();
  43.  
  44. }
  45. }

Java基础十一--多态的更多相关文章

  1. Java基础(十一) Stream I/O and Files

    Java基础(十一) Stream I/O and Files 1. 流的概念 程序的主要任务是操纵数据.在Java中,把一组有序的数据序列称为流. 依据操作的方向,能够把流分为输入流和输出流两种.程 ...

  2. Java基础之多态和泛型浅析

    Java基础之多态和泛型浅析 一.前言: 楼主看了许多资料后,算是对多态和泛型有了一些浅显的理解,这里做一简单总结 二.什么是多态? 多态(Polymorphism)按字面的意思就是“多种状态”.在面 ...

  3. 【Java基础】多态

    首先先来个总结: 什么是多态 面向对象的三大特性:封装.继承.多态.从一定角度来看,封装和继承几乎都是为多态而准备的.这是我们最后一个概念,也是最重要的知识点. 多态的定义:指允许不同类的对象对同一消 ...

  4. java基础之 多态

    在面向对象编程(Object-Oriented Programming, OOP)中,多态机制无疑是其最具特色的功能,甚至可以说,不运用多态的编程不能称之为OOP.这也是为什么有人说,使用面向对象语言 ...

  5. 黑马程序员——JAVA基础之多态与Object

    ------- android培训.java培训.期待与您交流! ----------  多态 : 多态定义:  某一类事物的多种存在形态. 多态的体现: 父类的引用指向了自己的子类对象.       ...

  6. Java基础:多态(重载和重写)

    转载请注明出处:jiq•钦's technical Blog (1)域与静态方法 记住"仅仅有普通方法的调用是多态的". 而域和静态方法不是:对于域的訪问.在编译期间就已经进行解析 ...

  7. java基础(十一) 枚举类型

    枚举类型Enum的简介 1.什么是枚举类型 枚举类型: 就是由一组具有名的值的有限集合组成新的类型.(即新的类). 好像还是不懂,别急,咱们先来看一下 为什么要引入枚举类型 在没有引入枚举类型前,当我 ...

  8. java基础14 多态(及关键字:instanceof)

    面向对象的三大特征: 1.封装   (将一类属性封装起来,并提供set()和get()方法给其他对象设置和获取值.或者是将一个运算方法封装起来,其他对象需要此种做运算时,给此对象调用) 2.继承   ...

  9. java基础(多态)_03

    一.多态 1.概念:一个对象的多种形态 2.前提: a:必须有继承 b:必须有重写(只有重写才会有意义,没重写语法没错) 3.体现形式: 父类类型 变量名 = new 子类类型(): 4.注意事项: ...

随机推荐

  1. uva1494 最小生成树--例题

    这题说的是n个城市 建路 使他们联通然后 , 可以使用一条超级的路这条路不计入总长,此时路长度为B, 这条路链接的两个城市人口与和为A+B, 然后计算出最大的A/B 解题 先生成一颗最小生成树,然后 ...

  2. 线段树(I tree)

    Codeforces Round #254 (Div. 2)E题这题说的是给了一个一段连续的区间每个区间有一种颜色然后一个彩笔从L画到R每个区间的颜色都发生了 改变然后 在L和R这部分区间里所用的颜色 ...

  3. nodejs中req.body对请求参数的解析问题

    首先,先了解一下关于http协议里定义的四种常见数据的post方法,分别是: application/www-form-ulrencoded multipart/form-data applicati ...

  4. linux复制指定目录下的全部文件到另一个目录中,linux cp 文件夹

    linux复制指定目录下的全部文件到另一个目录中复制指定目录下的全部文件到另一个目录中文件及目录的复制是经常要用到的.linux下进行复制的命令为cp.假设复制源目录 为 dir1 ,目标目录为dir ...

  5. JDBC报错记录

    用JDBC连接oracle时 有如下问题: 问题一.java.lang.ClassNotFoundException: oracle.jdbc.driver.oracledriver 解决: 可以在环 ...

  6. NSDictionary打印编码改中文的方法

    1,转NSData NSData *jsonData = [NSJSONSerialization dataWithJSONObject:json options:NSJSONWritingPrett ...

  7. MySQL Crash Course #01# Chapter 1. 2 概念. Primary key

    索引 database table schema Primary Key MySQL 书的第一章介绍一些基本的概念.理解数据库是掌握 MySQL 非常重要的一个部分. 第二章简单介绍了 MySQL 以 ...

  8. Confluence5.8部分空间名称显示为问号的解决方案

    Confluence5.8部分空间名称显示为问号的解决方案 原因: 连接MySQL的时候,有没有在连接串中指定&useUnicode=true&characterEncoding=ut ...

  9. msf辅助模块的应用——20145301

    msf辅助模块的应用 实验步骤 创建msf所需的数据库 service postgresql start msfdb start 开启msf,输入命令 use auxiliary/scanner/di ...

  10. 关于cp命令的编写

    关于cp命令的编写 娄老师在课上详细的讲了命令who的编写过程~对此,我很有启发!于是想亲自动手试试~ 有什么不足的地方请大家提出来! Learning by doing ~ 做中学,真的只有自己动手 ...