我们用猫狗案例来表明在java中使用多态的好处:

    

  1. class Animal{
  2. public Animal(){}
  3. public void eat(){
  4. System.out.println("吃饭");
  5. }
  6. public void sleep(){
  7. System.out.println("睡觉");
  8. }
  9. }
  10. class Cat extends Animal{
  11. public Cat(){}
  12. public void eat(){
  13. System.out.println("猫吃鱼");
  14. }
  15. public void sleep(){
  16. System.out.println("猫趴着睡觉");
  17. }
  18. }
  19. class Dog extends Animal{
  20. public Dog(){}
  21. public void eat(){
  22. System.out.println("狗吃肉");
  23. }
  24. public void sleep(){
  25. System.out.println("狗站着睡觉");
  26. }
  27. }
  28. class Pig extends Animal{
  29. public Pig(){}
  30. public void eat(){
  31. System.out.println("猪吃草");
  32. }
  33. public void sleep(){
  34. System.out.println("猪也趴着睡觉");
  35. }
  36. }
  37.  
  38. class AnimalTool{
  39. //总结: 使用static方法与priva的原因是,避免有些笨蛋
  40. //直接使用创建工具类对象的方式来访问工具类中的方法
  41. private AnimalTool(){}
  42. /*public static void useCat(Cat c){
  43. c.eat();
  44. c.sleep();
  45. }
  46. public static void useDog(Dog d){
  47. d.eat();
  48. d.sleep();
  49. }
  50. public static void usePig(Pig p){
  51. p.eat();
  52. p.sleep();
  53. }
  54. */
  55. public static void useAnimal(Animal a){
  56. a.eat();
  57. a.sleep();
  58. }
  59.  
  60. }
  61. class DuoTaiDemo2{
  62. public static void main(String []args){
  63. Cat c=new Cat();
  64. c.eat();
  65. c.sleep();
  66.  
  67. Cat c2=new Cat();
  68. c2.eat();
  69. c2.sleep();
  70.  
  71. Cat c3=new Cat();
  72. c3.eat();
  73. c3.sleep();
  74. System.out.println("----------------");
  75. //接下来是狗
  76. Dog d=new Dog();
  77. d.eat();
  78. d.sleep();
  79.  
  80. Dog d2=new Dog();
  81. d2.eat();
  82. d2.sleep();
  83.  
  84. Dog d3=new Dog();
  85. d3.eat();
  86. d3.sleep();
  87. System.out.println("----------------");
  88.  
  89. //接下来是 猪
  90. Pig p=new Pig();
  91. p.eat();
  92. p.sleep();
  93.  
  94. Pig p2=new Pig();
  95. p2.eat();
  96. p2.sleep();
  97.  
  98. Pig p3=new Pig();
  99. p3.eat();
  100. p3.sleep();
  101. /*
  102. System.out.println("----------接下来利用工具类实现以上效果----------");
  103.  
  104. AnimalTool.useCat(c);
  105. AnimalTool.useCat(c2);
  106. AnimalTool.useCat(c3);
  107.  
  108. System.out.println("-------------");
  109.  
  110. AnimalTool.useDog(d);
  111. AnimalTool.useDog(d2);
  112. AnimalTool.useDog(d3);
  113.  
  114. System.out.println("-------------");
  115.  
  116. AnimalTool.usePig(p);
  117. AnimalTool.usePig(p2);
  118. AnimalTool.usePig(p3);
  119. */
  120. System.out.println("----------接下来利用【多态性】类实现以上效果----------");
  121. Animal cc=new Cat();
  122. AnimalTool.useAnimal(cc);
  123.  
  124. Animal dd=new Dog();
  125. AnimalTool.useAnimal(dd);
  126.  
  127. Animal pp=new Pig();
  128. AnimalTool.useAnimal(pp);
  129. }
  130. }

    在这个案例中,我们分别使用了三种方法逐渐优化。

  第一种---笨方式

    直接利用猫狗类创建对象,多次进行调用eat sleep方法,导致存在大量冗余代码。

 

    第二种---创建工具类,将每个动物的eat sleep方法放在各自静态方法中,并将工具类构造方法声明为private,使其仅可通过类名调用。

          

      在这种方法中,AnimalTool.useCat(c);这个语句相当于之前的  c.eat();    两句,按之前方法,如果我们定义非常多猫,那代码岂不是冗余巨大?

                                      c.sleep() ;

  第三种------  将工具类中各自的方法优化为一个:useAnimal(Animal  a), 并在主函数中通过多态的方式创建对象,如 Animal a=new Cat();

         这样减少的是工具类中的冗余代码。

  以上。

java多态 -- 猫狗案列的更多相关文章

  1. Java中如何分析一个案列---猫狗案例为例

    猫狗案例: 具体事务: 猫.狗 共性: 姓名.年龄.吃饭 分析:从具体到抽象 猫: 姓名.年龄--->成员变量 吃饭       ---> 成员方法 构造方法:无参.有参 狗: 姓名.年龄 ...

  2. Java 多态——与C++的比较

    学习了Java和C++之后,由于长期不使用C++,而java的基础知识掌握不牢,现在已经搞不清java多态了.现在先来谈谈java多态,稍后有时间再更新C++的多态,并进行比较~ 一. Java的多态 ...

  3. 09-02 java 多态

    多态的前提.多态的特点 /* 多态:同一个对象(事物),在不同时刻体现出来的不同状态. 举例: 猫是猫,猫是动物. 水(液体,固体,气态). 多态的前提: A:要有继承关系. B:要有方法重写. 其实 ...

  4. Java-Runoob-面向对象:Java 多态

    ylbtech-Java-Runoob-面向对象:Java 多态 1.返回顶部 1. Java 多态 多态是同一个行为具有多个不同表现形式或形态的能力. 多态就是同一个接口,使用不同的实例而执行不同操 ...

  5. 深入理解java多态没有烤山药的存在,java就不香了吗?

    目录 1. 从吃烤山药重新认识多态 2. 多态前提条件[重点] 3. 多态的体现 4. 多态动态绑定与静态绑定 5. 多态特性的虚方法(virtual) 7. 向上转型 8. 向下转型 9. 向上向下 ...

  6. axis1,xfire,jUnit 测试案列+开Web Service开发指南+axis1.jar下载 代码

    axis1,xfire,jUnit 测试案列+Web Service开发指南(中).pdf+axis1.jar下载    代码 项目和资源文档+jar 下载:http://download.csdn. ...

  7. 学JAVA第十六 天,JAVA多态

    今天老师讲了多态的使用 多态是同一个行为具有多个不同表现形式或形态的能力. 多态的优点: 1. 消除类型之间的耦合关系 2. 可替换性  3. 可扩充性 4. 接口性 5. 灵活性 6. 简化性 我个 ...

  8. Java - 22 Java 多态

    Java 多态 多态是同一个行为具有多个不同表现形式或形态的能力. 多态性是对象多种表现形式的体现. 比如我们说"宠物"这个对象,它就有很多不同的表达或实现,比如有小猫.小狗.蜥蜴 ...

  9. 大数据技术之_14_Oozie学习_Oozie 的简介+Oozie 的功能模块介绍+Oozie 的部署+Oozie 的使用案列

    第1章 Oozie 的简介第2章 Oozie 的功能模块介绍2.1 模块2.2 常用节点第3章 Oozie 的部署3.1 部署 Hadoop(CDH版本的)3.1.1 解压缩 CDH 版本的 hado ...

随机推荐

  1. smarty中判断一个变量是否存在于一个数组中或是否存在于一个字符串中?

    smarty支持php的系统函数可以直接使用{if in_array($str, $arr) || strpos($str, $string)} yes {else} no{/if}

  2. android:persistent属性

    application PhoneApp既没有被Broadcast唤醒,也没有被其他service调用,那么是android是通过什么方式来启动PhoneApp,所以就发现了属性android:per ...

  3. bzoj2096: [Poi2010]Pilots

    Description Tz又耍畸形了!!他要当飞行员,他拿到了一个飞行员测试难度序列,他设定了一个难度差的最大值,在序列中他想找到一个最长的子串,任意两个难度差不会超过他设定的最大值.耍畸形一个人是 ...

  4. Ruby自学笔记(二)— Ruby的一些基础知识

    Ruby安装好之后,我们就可以来实践Ruby语言了. 以下是一些学习到的简单基础知识: 1. 如何执行Ruby文件? 我们编写的Ruby文件是以rb为后缀名的,例如:XXX.rb.当要执行ruby文件 ...

  5. 关于set或map的key使用自定义类型的问题

    我们都知道set或map的key使用自定义类型时必须重载<关系运算符 但是,还有一个条件,所调用重载的小于操作符,使用的对象必须是const 而对象调用的方法也必须是const的 1 #incl ...

  6. frameset iframe用来分页

    frameset用来分大的框架 iframe用来在frame分框架之后,内嵌分割. <FRAMESET border=1 frameSpacing=1 borderColor=#47478d r ...

  7. BZOJ 3884 上帝与集合的正确用法

    Description 根据一些书上的记载,上帝的一次失败的创世经历是这样的: 第一天, 上帝创造了一个世界的基本元素,称做"元". 第二天, 上帝创造了一个新的元素,称作&quo ...

  8. BZOJ 3570 动物园

    Description 近日,园长发现动物园中好吃懒做的动物越来越多了.例如企鹅,只会卖萌向游客要吃的.为了整治动物园的不良风气,让动物们凭自己的真才实学向游客要吃的,园长决定开设算法班,让动物们学习 ...

  9. hdu 5113 Black And White

    http://acm.hdu.edu.cn/showproblem.php?pid=5113 题意:给你n*m的格子,然后在每个格子内涂色,相邻格子不能同色,然后给你每个颜色涂的格子的固定个数,然后可 ...

  10. iOS Developer Libray (中文版)-- About Objective-C

    该篇是我自己学习iOS开发时阅读文档时随手记下的翻译,有些地方不是很准确,但是意思还是对的,毕竟我英语也不是很好,很多句子无法做到准确的字词翻译,大家可以当做参考,有错误欢迎指出,以后我会尽力翻译的更 ...