A股上市公司传智教育(股票代码 003032)旗下技术交流社区北京昌平校区

 找回密码
 加入黑马

QQ登录

只需一步,快速开始

本帖最后由 n361204357 于 2015-7-23 22:58 编辑

  1. <P> </P>
  2. <DIV class=blockcode>
  3. <BLOCKQUOTE>/*
  4. 多态:对象在不同时刻表现出来的不同状态。
  5. 原因:在设计一个方法中,通常希望具有通用性,比如实现一个动物叫,可以接受一个动物参数类型,狗叫,猫叫。
  6. 前提:
  7. 1,要有继承关系;
  8. 2,要有方法重写;//其实没有也是可以的,但是如果没有这个就没有意义。
  9. 3,要有父类引用子类对象。Fu f=new Zi;
  10. 特点:
  11. 1,成员变量:编译看左边,运行看左边。
  12. 2,构造方法:创建子类对象的时候,访问父类构造方法,对父类数据进行初始化。
  13. 3,成员方法:编译看左边,运行看右边。因为方法存在重写,所以看右边。
  14. 4,静态方法:编译看左边,运行看左边。
  15. (静态和类相关,静态算不上重写,所以,访问还是左边的)
  16. 作用:为了提高代码的扩展性和可维护性。
  17. 格式:Fu f=new Zi();
  18. 注意事项:
  19. 多态弊端:
  20. 父类引用不能使用子类特有功能。
  21. 我就想使用子类的特有功能?行不行?
  22. 行。

  23. 怎么用呢?
  24. 1,创建子类对象调用方法即可。(可以,但是很多时候不合理。而且,太占内存了)
  25. 2,把父类的引用强制转换为子类的引用。(向下转型)
  26. 基本类型:隐式转换(小到大),强制转换(大到小)。
  27. 引用类型:向上转型(小到大),向下转型(大到小)。
  28. 对象间的转型问题:
  29. 向上转型:父类引用指向子类对象 编译看左边
  30. Fu f = new Zi();
  31. 向下转型:父类引用转为子类对象 编译看子类
  32. Zi z = (Zi)f; //要求该f必须是能够转换为Zi的。
  33. java.lang.ClassCastException:类型转换异常。
  34. 类型不匹配。
  35. 你存储的是Cat,想转换成Dog,肯定不行。
  36. */
  37. class Fu
  38. {
  39. int a=10;
  40. void Fu()
  41. {
  42. System.out.println("创建子类对象的时候,访问父类构造方法,对父类数据进行初始化?");
  43. }
  44. public static void show() //静态方法编译看左边,运行看左边。(静态和类相关,静态算不上重写,所以,访问还是左边的)
  45. {
  46. System.out.println("Fu play");
  47. }
  48. public void eat()
  49. {
  50. System.out.println("Fu eat");
  51. }
  52. public void speak()
  53. {
  54. System.out.println(a);
  55. }
  56. }
  57. class Zi extends Fu
  58. {
  59. int a=20;//成员变量编译看左边,运行看右边。
  60. public static void show() //静态方法编译看左边,运行看左边。(静态和类相关,静态算不上重写,所以,访问还是左边的)
  61. {
  62. System.out.println("Zi play");
  63. }
  64. public void eat() //成员方法编译看左边,运行看右边,因为存在重写
  65. {
  66. System.out.println("Zi eat");
  67. }
  68. public void speak()
  69. {
  70. System.out.println(a);
  71. }
  72. public void test()
  73. {
  74. System.out.println("父类能引用子类功能吗?");
  75. }
  76. }
  77. class method1 //工具类,为了提高代码的扩展性和可维护性。
  78. {
  79. public static void method(Fu x)
  80. {
  81. x.show();
  82. x.eat();
  83. }
  84. }
  85. class 多态
  86. {
  87. public static void main(String[] args)
  88. {
  89. Fu f=new Zi();

  90. f.show();
  91. f.eat();
  92. System.out.println(f.a);//成员变量编译看左边,运行看右边。---10
  93. f.speak();//这个是调用子类方法,就近原则. ---20

  94. method1.method(f);
  95. Fu f1=new Fu();
  96. //f1.test();//父类不能引用子类功能
  97. Zi z=(Zi) f1;//要求该f必须是能够转换为Zi的。
  98. //f1.test();
  99. method1.method(f1);
  100. /*
  101. //多态
  102. Animal a = new Dog(); //向上转型
  103. a.show();
  104. //给a重新赋值
  105. a = new Cat(); //向上转型
  106. a.show();
  107. Cat c = (Cat)a; //向下转型
  108. c.show();
  109. c.playGame();
  110. Dog d = (Dog)a;//java.lang.ClassCastException:类型转换异常。
  111. d.show();
  112. */

  113. }
  114. }
复制代码


0 个回复

您需要登录后才可以回帖 登录 | 加入黑马