多态

介绍

多态(Polymorphism)是面向对象编程的三大特性之一,它允许将父类对象设置为对子类对象的引用,这样就可以根据运行时绑定的不同子类来调用不同的行为。

多态能让程序设计更加灵活,使代码可以应对未来的扩展和变化。

知识点

  1. 类做参数:父类做参数,传递子类对象,类强制转换为其他类

  2. 多态分类:具体类多态,抽象类多态,接口多态:通过实现类对对象实例化,这是接口多态

  3. 多态的前提和体现

    • 有继承/实现关系

    • 方法重写

    • 有父类引用指向子类对象

      // Parent parent(父类引用) = new Son();(子类对象)

    • 或有接口引用指向实现类对象

  4. 多态访问特点

    • 子类继承父类后,多态访问优先执行父类方法,属性。因为子类父类中两个变量即使名字相同也是两个不同的变量,this.变量名(子类)

    • super.变量名(父类)。但是子类的方法重写后的方法优先级大于父类方法

  5. 多态的优点和缺点

    • 提高程序的扩展性
    • 定义方法的时候,使用父类型作参数,将来使用时传递具体的子类型参与操作
    • 缺点:不能使用子类特有功能(只能使用子类重写的方法)

​ 因为new 出对象为子类,所以父类指向子类那个对象的地址

  1. 多态的转型
    • 向上转型(多态机制):从子到父
    • 向下转型(强转)可能发生类型转换异常 :从父到子

案例

代码

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
abstract class Animal{
void play() {
System.out.println("玩耍");
};

void eat(){};


}

// dog extengs Animal
class Dog extends Animal{
@Override
public void eat(){
System.out.println("我是狗吃骨头");
}
}
// cat extends Animal
class Cat extends Animal{
@Override
public void eat(){
System.out.println("我是猫吃鱼");
}
}
public class Polymorphism {
public static void main(String[] args) {

// Polymorphism dog
Animal animal1 = new Dog();
animalDisplay(animal1);

// Polymorphism cat
Animal animal2 = new Cat();
animalDisplay(animal2);
}

public static void animalDisplay(Animal animal){
animal.play();
animal.eat();
}
}

运行结果

image-20230820212158986

假如我现在有一个小狗,它可以==玩耍==和==吃饭==,我又收养了一个猫,猫和狗不同,猫可以==玩耍==也可以==吃饭==,问题在于狗喜欢吃骨头,猫喜欢吃鱼,你可以创建两个类,一个代表猫一个代表狗

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
public class Cat{
public void eat(){
System.out.println("我是猫吃鱼");
}

public void play(){
System.out.println("玩耍");
}
}

public class Dog{
public void eat(){
System.out.println("我是狗吃骨头");
}

public void play(){
System.out.println("玩耍");
}
}

你会发现,猫和狗play和eat方法是重复的,造成代码冗余,不美观,就算你可以忍受这两个动物类的冗余,如果我以后突然想养100种动物,你又该怎么办?很自然我们想将他们定义为抽象类Animal的子类,我们对于两者共同的方法,play()只需要在父类Animal中定义,对于两者差异的地方,eat()方法我们只需要在不同的类继承方法做到差异化实现。

一句话总结:多态是面向未来的,本例子动物种类在数量多的情况下,多态的使用会极大的提高你的清晰程度,ok到这里了,希望这篇文章能帮到你。