8.1.1 什么是多态:

  1. 1.面向对象的三大特征:封装、继承、多态。
  2. 2.多态的含义:使同一个行为可以根据不同的调用对象采取不同的反应。
  3. 3.实现多态的技术称为:动态绑定(dynamic binding),是指在执行期间判断所引用对象的实际类型,根据其实际的类型调用其相应的方法。
  4. 4.多态存在的必要条件:
  5. 4.1 类的继承
  6. 4.2 方法的重写
  7. 4.3 父类的引用指向子类对象(Fu fu=new Son();)
  8. 5.多态的作用:消除类型之间的耦合关系

8.1.2再讨论向上转型
向上转型之后,子类的方法可能会丢失。

  1. package com.zx.test08;
  2. enum Note {
  3. MIDDLE_E, C_SHAPP, B_FLAT;
  4. }
  5. class Instrument{
  6. public void play(Note note){//弹奏的方法
  7. System.out.println("弹奏乐器");
  8. }
  9. }
  10. class Wind extends Instrument{
  11. @Override
  12. public void play(Note note) {
  13. System.out.println("Wind弹奏"+note);
  14. }
  15. public void test(){
  16. System.out.println(".........");
  17. }
  18. }
  19. public class Music {
  20. public static void tune(Instrument instrument){
  21. //instrument.test();Wind向上转为Instrument后会丢失方法
  22. instrument.play(Note.MIDDLE_E);
  23. }
  24. public static void main(String[] args) {
  25. Wind wind=new Wind();
  26. tune(wind);
  27. }
  28. }
  1. 我们可能会想,会什么要使用向上转型呢?我们也可以单独为Wind写一个Wind类型的方法?也不是不行。但是当我们需要继承的类多啦呢?那么我们就需要为没一个类去写一遍方法,不仅仅会使我们的代码繁琐,对于我们以后想要添加新的导出类就会继续写大量代码。<br /> ** 如果说我们可以只写一个以基类为参数的方法,不去管导出类,编写的代码只有导出类打交道。这一点正是多态的是使用意义**
  1. package com.zx.test08;
  2. enum Note {
  3. MIDDLE_E, C_SHAPP, B_FLAT;
  4. }
  5. class Instrument{
  6. public void play(Note note){//弹奏的方法
  7. System.out.println("弹奏乐器");
  8. }
  9. }
  10. class Wind extends Instrument{
  11. @Override
  12. public void play(Note note) {
  13. System.out.println("Wind弹奏"+note);
  14. }
  15. public void test(){
  16. System.out.println(".........");
  17. }
  18. }
  19. public class Music {
  20. public static void tune(Instrument instrument){
  21. //instrument.test();Wind向上转为Instrument后会丢失方法
  22. instrument.play(Note.MIDDLE_E);
  23. }
  24. public static void main(String[] args) {
  25. Instrument instrument=new Wind();
  26. tune(instrument);
  27. }
  28. }