java-面向对象特性之多态性

面向对象的特性三:多态性

  • 它允许不同的对象对同一个消息做出不同的响应
  • 使用时需要有继承关系,适用于方法
  • 子类对象的多态性
    • 父类的引用指向子类的对象(或子类的对象赋给父类的引用)
  • 编译时多态性:
    • 也称为静态多态性,是指在编译时根据引用变量的类型来调用相应的方法。这种多态性是通过方法的重载实现的。编译器在编译时会根据引用变量的类型决定调用哪个方法。
  • 运行时多态性:
    • 也称为动态多态性,是指在运行时根据对象的实际类型来调用相应的方法。这种多态性是通过方法的重写实现的。在运行时,虚拟机会动态地确定调用哪个方法。
  • 多态实际上是由一个父类引申出来的拥有各自特殊的方法的子类的集合,这些子类都同属于同一个父类,能够使用父类所蕴含的方法,而多态体现在,当子类对父类的方法进行重写时,不同的子类对于同一个消息就会做出不同的反应;且在进行实例化时由于这些子类均属于同一父类,故可以使用向上转型,即使用父类名来声明子类名,而在new时使用具体的子类。使得由父类声明的实例拥有父类的类型却拥有具体子类的方法。而当拥有多个子类时,即出现了声明上为同一父类实例,却拥有对同一消息做出不同响应的能力
  • 例子:object类的形参可以填写一切对象
class Animal {
    void sound() {
        System.out.println("Animal makes a sound");
    }
}

class Dog extends Animal {
    void sound() {
        System.out.println("Dog barks");
    }
}

class Cat extends Animal {
    void sound() {
        System.out.println("Cat barks");
    }
}

public class AnimalTest {
    public static void main(String[] args) {
        AnimalTest test = new AnimalTest();
        Animal animal1 = new Dog(); // 编译时类型为Animal,运行时类型为Dog
        Animal animal2 = new Cat();// 编译时类型为Animal,运行时类型为Cat
        test.adopt(animal1); // 调用的是Dog类的sound方法
        test.adopt(animal2); // 调用的是Cat类的sound方法
    }

    public void adopt(Animal animal){
      animal.sound();//使用父类做方法的形参,即使增加了新的子类,方法也无需改变
    }
}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值