1,什么是 多态:

  1. 在同一个行为(对象),在不同时刻表现出来的不同形态。核心还是继承。
  2. 多态,是面向对象中最重要的概念,在Java中的体现形式是:父类的引用指向子类的对象。

    2,多态 的 前提 和 体现:

    前提:

    • 有继承 或 有实现关系(实现接口);
    • 有方法的重写;
    • 有父类引用指向子类对象;

      3,多态 的 格式(向上转型):

      父类/接口 变量名 = new 子类/实现类();
  3. 还有一种更推荐的格式:(先new子类或父类对象,再赋值转型)

  4. 这样子就能又拥有类的对象,又能互相转型;

子类/接口 对象名A = new 父类/接口();
父类/接口 对象名2 = 对象名A;
如:
SmartAudi sa = new SmartAudi();
Audi aa = sa ;

  1. //狗是animal的子类;
  2. Animals a=new Dog();
  3. //注意:!!!!!!!!!!
  4. //还有一种情况:子类对象赋值给父类对象也是多态(向上转型)的一种形式哦:
  5. //Audi类(父类)
  6. //smartAudi继承Audi类:
  7. SmartAudi sa = new SmartAudi();
  8. Audi aa = sa ;
  9. //或者
  10. Audi aa=new Audi();
  11. aa = sa ;
  12. //实际上这里的标准格式为:
  13. Audi aa = new SmartAudi();
  14. // 向下转型 同理;
  15. Audi aaa=new Audi();
  16. SmartAudi saa = (SmartAudi) aaa;

4,多态的 调用:

  1. 编译看左边,运行看右边;
  2. 看左边,父类有什么方法就只能调什么方法;看右边,运行的是子类重写父类的方法。 ```java //狗是animal的子类; Animals a=new Dog(); //这里的eat是父类的抽象方法,运行的是子类的重写方法 a.eat();

//如果子类没有,那子类将会继承父类的方法,在子类中运行父类方法

  1. <a name="uK6ub"></a>
  2. ## 5,多态的好处和坏处:
  3. 1. 好处:多态右边可以给任意子类,提高代码的拓展性。
  4. ```java
  5. public class Demo01 {
  6. public static void main(String[] args) {
  7. Animals a=new Dog();
  8. a.setEat();
  9. Animals a2=new Cat();
  10. a2.setEat();
  11. setText01(a);
  12. setText01(a2);
  13. }
  14. //使用多态就可以将参数设置一个父类作引用类型来传多个子类对象,来调用对应的子类方法
  15. public static void setText01(Animals a){
  16. a.setEat();
  17. }
  18. }
  1. 坏处:

不能使用子类的特有功能,因为多态只能使用父类已有的方法,子类需要去重写调用;

6,多态的 引用类型的转换:

  1. 向上转换(自动):(见多态的格式)

父类 变量名 = new 子类();
弊端:不能使用子类特有方法。

  1. 向下转换(强制):

子类 变量 = (子类)父类对象名;
好处/作用:能让父类调用子类特有方法,或使用子类的属性内容。

  1. //向上转型(多态):
  2. Animals a=new Dog();
  3. a.setEat();
  4. //向下转型(强转):
  5. Dog d=(Dog) a;

7,instanceof 关键字 (用于强转):

作用:用于判断强转的对象类型是否为需要强转的对象类型;

  1. 避免强制转换出现问题: 关键字 instanceof;
  2. 格式:变量(对象)名 instanceof类型 ```java 例1: Animals a=new Cat();
    a.setEat();

//instanceof关键字,避免强制转换出现转错类型的问题 //这里要将父类对象a转成狗的对象类型b。所以先判断这个多态的子类是不是狗; boolean b=a instanceof Dog; //如b==true则 if (b){ Dog d=(Dog) a;
a.setEat();
}else { System.out.println(“不是狗”); }

例2: public void setText01(Usb u){ u.connect();

  1. if (u instanceof Usbmouse){
  2. Usbmouse us=(Usbmouse) u;
  3. us.clicks();
  4. }else if (u instanceof Usbkeyborad){
  5. Usbkeyborad uk=(Usbkeyborad) u;
  6. uk.Qiao();
  7. }
  8. u.disConnect();

} ```