3_多态

2020-11-29  本文已影响0人  真是个点子王

多态的形式

  父类类型    对象名称 = new 字类构造器;
  接口           对象名称 = new 实现类构造器;

多态的概念

public class PolymorphicDemo {
    public static void main(String[] args) {
        //  父类类型 对象名称 = new 子类构造器;
        Animal dlam = new Cat();
        dlam.run(); // 对于方法的调用:编译看左边,运行看右边。
        System.out.println(dlam.name); // 对于变量的调用:编译看左边,运行看左边。

        Animal taiDi = new Dog();
        taiDi.run(); // 对于方法的调用:编译看左边,运行看右边。
        System.out.println(taiDi.name); // 对于变量的调用:编译看左边,运行看左边。
    }
}

class Dog extends Animal{
    public String name = "🐶名称Dog";
    @Override
    public void run(){
        System.out.println("🐕跑的贼快~~~~!");
    }
}

class Cat extends Animal{
    public String name = "🐱名称Cat";
    @Override
    public void run(){
        System.out.println("🐱跑的飞快~~~~!");
    }
}

class Animal{
    public String name = "动物名称Animal";
    public void run(){
        System.out.println("动物跑!");
    }
}

多态的使用前提

多态的优、劣势

优势

劣势

public class PolymorphicDemo {
    public static void main(String[] args) {
        //  父类类型 对象名称 = new 子类构造器;
        Animal dlam = new Dog();
        dlam.run(); // 对于方法的调用:编译看左边,运行看右边。
        // dlam.lookDoor(); // 报错了,多态形式下,编译看左边,左边没有独有功能

        Animal taidi = new Dog();
        go(taidi);

        Animal tom = new Cat();
        go(tom);
    }

    // 开发一个游戏 所有动物都可以进来比赛
    public static void go(Animal d){
        System.out.println("开始。。");
        d.run();
        System.out.println("结束。。");
    }
}

class Dog extends Animal{
    @Override
    public void run(){
        System.out.println("🐕跑的贼快~~~~!");
    }

    // 独有功能
    public void lookDoor(){
        System.out.println("🐶看门");
    }
}

class Cat extends Animal{
    @Override
    public void run(){
        System.out.println("🐱跑的飞快~~~~!");
    }

    // 独有功能
    public void catchMouse(){
        System.out.println("🐱抓🐀");
    }
}

class Animal{
    public void run(){
        System.out.println("动物跑!");
    }
}

引用类型的强制类型转换

类型 变量名称 = (类型)(对象或者变量)
变量 instanceof 类型
//判断前面的变量是否是后面的类型或者其子类类型才会返回true
public class PolymorphicDemo {
    public static void main(String[] args) {
        Animal a = new Wolf();
        a.run();
        // a.catchSheep(); // 报错!

        // 1.把动物类型的变量a 转换成 真实的狼类型
        Wolf w = (Wolf) a;
        w.catchSheep();

        // 2.多态下类型转换异常问题研究(重点)
        Animal a1 = new Cat();
        //Wolf w1 = (Wolf) a1; // 编译阶段没有报错!在运行阶段出现ClassCastException类型转换成!

        if(a1 instanceof Cat){
            Cat c1 = (Cat) a1;
            c1.catchMouse();
        }else if(a1 instanceof Wolf){
            Wolf w1 = (Wolf) a1;
            w1.catchSheep();
        }
    }
}

class Wolf extends Animal{
    @Override
    public void run(){
        System.out.println("狼跑的飞快~~~");
    }

    public void catchSheep(){
        System.out.println("🐺抓🐏");
    }
}

class Cat extends Animal{
    @Override
    public void run(){
        System.out.println("猫跑的贼快~~~");
    }

    public void catchMouse(){
        System.out.println("🐱抓🐀~~");
    }
}

class Animal{
    public void run(){
        System.out.println("动物可以跑~~");
    }
}
上一篇 下一篇

猜你喜欢

热点阅读