面向对象的三大特征之一多态

多态

概念

  • 多态是同一个对象,在不同时刻表现出来不同的形态,称之为多态。

    • 例如:水,我们把水理解成为一个对象,而水会有不同的形态,比如 液态水、冰块、水蒸气
  • 多态的前提

    • 有继承/实现关系(继承是类和类之间的关系,实现是类和接口直接的关系)
    • 有方法重写(继承之后,要对方法进行重写)
    • 有父类的引用指向子类的对象。例如:Animal a = new Cat();
  • 多态成员的访问特点(非常重要,一定得理解,请先看口诀,再结合图片下方注意文字,和图片理解)

    • 口诀(父类是左边,子类是右边):

      • 对于成员变量,编译看左边,执行看左边
      • 对于成员方法,编译看左边,执行看右边

      注意:

      ​ ①:先解释下口诀,编译看左边,也就是看左边有无这个成员,有的话编译才通过,我们可以看到图片一和图片二两张都是因为左边父类中无 爆红的这个成员,所以报错

      ​ ②:对于成员变量,编译看左边(也就是看左边父类中有无这个成员,有的话编译通过),执行看左边(我们看第三张图,可以看到最中运行的结果是左边父类中的成员变量值)

      ​ ③:对于成员方法,编译看左边(也就是看左边父类中有无这个成员,有的话编译通过),执行看右边(我们看第三张图,可以看到最中运行的结果是右边子类中的成员方法,因为方法重写了)

多态的好处和弊端

  • 好处:提高了程序的扩展性,定义方法的时候,使用父类作为参数,将来在使用的时候使用具体的子类参与操作

  • 弊端:不能使用子类特有的功能(必须父类中有【回想口诀,只有编译通过才行】)

多态的转型

  • 多态的弊端是,不能使用子类特有的功能,怎么办呢?就提出我们多态的转型。

    类型方向
    向上转型从子到父父类引用指向子类对象Animal a = new Cat();
    向下转型从父到子父类引用转为子类对象Cat b = (Cat)a

    注意:向下转型,有个前提,得是同一种对象

    ​ Animal a = new Cat(); // a 是Animal类型,但是本质是 猫

    ​ Dog d = (Dog)a; // 很明显这行就错了,(Dog)a 相当于强转,但是 猫怎么能转成狗呢!

    // 动物类
    class Animal{
        public void show(){
            System.out.println("动物!");
        }
    }
    // 狗类
    class Dog extends Animal{
        public void show(){
            System.out.println("狗!");
        }
        public void speak(){
            System.out.println("汪汪");
        }
    }
    // 猫类
    class Cat extends Animal{
        public void show(){
            System.out.println("猫!");
        }
        public void eat(){
            System.out.println("小鱼干");
        }
    }
    
    public class Test {
        public static void main(String[] args) {
            // 向上转型
            Animal a = new Cat();
            Animal b = new Dog();
            // 调用方法(父类对象调用,多态的形式,记得口诀)
            a.show();
            b.show();
            // 编译不通过,因此爆红
    /*        a.speak();
            a.eat();*/
    
            // 向下转型
            Cat c = (Cat)a;
            Dog d = (Dog)b;
            // 调用方法(子类对象调用)
            c.eat();
            c.show();
            d.speak();
            d.show();
    
    /*        Cat c1 = (Cat)b;
            c1.speak();*/
        }
    }
    

  • 多态很重要,一定要理解!!!

  • 其他两大特征可参考下面这两篇文章:

  • 25
    点赞
  • 23
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值