likes
comments
collection
share

【Java】面向对象的特性之一:多态性

作者站长头像
站长
· 阅读数 24

1️⃣前言

大家好,我是翼同学。今天笔记的内容是:

  • 多态

2️⃣内容

2.1、什么是多态?

我们将一个对象变量可以引用多种实际类型的现象称为多态

在继承机制中,每个子类的对象都属于父类的对象,这体现了is-a规则,也就是说,程序中出现的父类对象都可以用子类对象置换。我们可以将一个子类的对象赋给父类变量。

2.2、Java 多态

Java中,对象变量是多态的。多态使得Java程序可以有更好的扩展,并可对所有类的对象进行通用处理。

多态的常见形式为:

父类类型 对象名 = new 子类构造器;
// 或者
接口 对象名 = new 实现类构造器;

多态存在的必要条件如下:

  • 有若干子类继承同一个父类;
  • 子类重写了父类中的方法;
  • 父类的引用指向了子类对象。

注意:

一个父类变量既可以引用父类对象,也可以引用任何一个子类对象。但是反过来就不行。我们不能将一个父类的引用赋给子类变量,这是非法的。

在多态的形式下,定义方法时使用父类类型作为参数,该方法就可以接受父类的一切子类对象,对象可以实现解耦合,更便于维护,也体现了多态的扩展性。

2.3、多态的举例

父类如下所示:

// 动物类
abstract class Animals {
    public String name = "Animals";
    abstract void eat();
}

下面是两个子类:

// 子类1:猫类
class Cat extends Animals {
    public void eat() {
        System.out.println("猫吃猫粮");
    }
}

// 子类2:狗类
class Dog extends Animals {
    public void eat() {
        System.out.println("狗吃狗粮");
    }
}

最后是主类的测试:

public class Test {
    public static void main(String[] args) {
        // 多态->  父类类型 变量名 = new 子类构造器;
        Animals a1 = new Cat();
        Animals a2 = new Dog();
        // 调用方法
        a1.eat();
        a2.eat();
        // 调用属性
        System.out.println(a1.name);
        System.out.println(a1.name);
    }
}

运行结果如下:

猫吃猫粮
狗吃狗粮
Animals
Animals

可以看到,同一个类型(Animals)的对象执行同一个行为,会表现出不同的行为特征。又由于多态更加侧重于行为多态,因此变量的调用和方法调用是不同的。

2.4、虚函数与动态绑定

虚函数的存在是为了多态。但在Java中,并没有虚函数的概念。事实上Java的普通方法就相当于C++的虚函数。如果对方法加上final修饰符后,就可以去掉Java中方法的虚函数特性。

另外,在运行时能够自动选择调用哪个方法的现象被称为动态绑定。对于Java来说,动态绑定是默认的处理方式。


3️⃣写在最后

好了,今天的笔记就记到这里。