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

 找回密码
 加入黑马

QQ登录

只需一步,快速开始


  1. //多态

  2. class Dog extends Animal
  3. {
  4.         public void eat()
  5.         {
  6.                 System.out.println("骨头");
  7.         }
  8.         public void lookHome()
  9.         {
  10.                 System.out.println("看家");
  11.         }
  12. }

  13. //描述猫
  14. class Cat extends Animal
  15. {
  16.         public void eat()
  17.         {
  18.                 System.out.println("鱼");
  19.         }
  20.         public void catchMouse()
  21.         {
  22.                 System.out.println("抓老鼠");
  23.         }
  24. }
  25. //进行抽取。将共性的功能抽取到父类Animal中。
  26. abstract class Animal
  27. {
  28.         public abstract void eat();
  29. }

  30. /*
  31. 多态:
  32.         【体现】
  33.                 父类的引用或者接口的引用指向了自己的子类对象。
  34.                 Dog d = new Dog();//Dog对象的类型是Dog类型。
  35.                 Animal a = new Dog();//Dog对象的类型右边是Dog类型,左边Animal类型。
  36.         【好处】
  37.                 提高了程序的扩展性。
  38.         【弊端】
  39.                 通过父类引用操作子类对象时,只能使用父类中已有的方法,不能操作子类特有的方法。
  40.         【前提】
  41.                 1,必须有关系:继承,实现。
  42.                 2,通常都有重写操作。
  43.         【子类的特有方法如何调用呢?】
  44.         Animal a = new Dog();//Animal是父类型,new Dog()是子对象。
  45.         但是父类型引用指向子类对象时,这就是让子类对象进行了类型的提升(向上转型)。
  46.         向上转型好处:提高了扩展性,隐藏了子类型。弊端:不能使用子类型的特有方法。
  47.         如果要想使用子类的特有方法,只有子类型可以用。
  48.         可以向下转型,强制转换。
  49.         Animal a = new Dog();
  50.         a.eat();
  51.         Dog d = (Dog)a;//将a转型为Dog类型。向下转型。
  52.         d.lookHome();
  53.         向下转型什么时候用?当需要使用子类型的特有内容时。
  54.        
  55.         注意:无论向上还是向下转型,最终都是子类对象做着类型的变化。
  56.        
  57.         【向下转型的注意事项】
  58.         Animal a = new Dog();
  59.         //Cat c = (Cat)a;向下转型因为不明确具体子类对象类型,所以容易引发ClassCastException异常。
  60.         所以为了避免这个问题,需要在向下转型前,做类型的判断。
  61.         判断类型用的是关键字 instanceof
  62.         if(a instanceof Cat)//a指向的对象的类型是Cat类型。
  63.         {
  64.                 //将a转型Cat类型。
  65.                 Cat c = (Cat)a;
  66.                 c.catchMouse();
  67.         }
  68.         else if(a instanceof Dog)
  69.         {
  70.                 Dog d = (Dog)a;
  71.                 d.lookHome();
  72.         }

  73.         【转型总结】
  74.         1,什么时候使用向上转型呢?
  75.                 提高程序的扩展性,不关系子类型(子类型被隐藏)。
  76.                 需要用子类的特有方法吗?不需要,哦了。向上转型。
  77.         2,什么时候使用向下转型呢?
  78.                 需要使用子类型的特有方法时。
  79.                 但是一定要使用 instanceof 进行类型的判断。避免发生 ClassCastException

  80. */

  81. class DuoTaiDemo2
  82. {
  83.         public static void main(String[] args)
  84.         {
  85.                 Dog d = new Dog();
  86. //                d.eat();
  87. //                d.lookHome();

  88.                 /*
  89.                 Animal a = new Dog();
  90.                 a.eat();//可以的。
  91. //                a.lookHome();//不可以的。
  92.                 */

  93.                 method(d);
  94.                 Cat c = new Cat();
  95.                 method(c);
  96.         }
  97.         public static void method(Animal a)
  98.         {
  99.                
  100.                 a.eat();
  101. //                Dog d = (Dog)a;//ClassCastException:类型转换异常。
  102. //                d.lookHome();

  103. //                a.lookHome();//不可以,因为动物不具备这个功能。
  104.         }

  105. }
复制代码

1 个回复

倒序浏览
继续努力的,总结不错。结合代码,知识点记得非常牢固。
回复 使用道具 举报
您需要登录后才可以回帖 登录 | 加入黑马