你好!今天我们即将完成有关OOP原理的一系列讲座。在本课中,我们将讨论多态性。 多态性是指将多种类型视为同一类型的能力。在这种情况下,对象的行为将根据它们所属的类型而有所不同。 让我们更详细地看看这个声明。让我们从第一部分开始:“处理多种类型的能力,就好像它们是同一类型一样。” 不同的类型怎么可能是同一种呢?听起来有点奇怪:/实际上很简单。例如,这种情况是在正常使用继承时出现的。让我们看看它是如何工作的。假设我们有一个简单的父类,
当不需要这种“概括”,相反我们需要物种的行为不同时,每种类型的行为都不同。由于多态性,您可以为各种类创建单个接口(方法集)。因此,程序的复杂性降低了。即使我们将程序扩展到 40 种猫,我们仍然会拥有最简单的界面 - 一种方法
Cat
只有一个方法run()
- “run”:
public class Cat {
public void run() {
System.out.println("Бег!");
}
}
现在让我们创建三个继承于Cat
: Lion
、Tiger
和的类Cheetah
,分别表示狮子、老虎和猎豹。
public class Lion extends Cat {
@Override
public void run() {
System.out.println("Лев бежит со speedю 80 км/ч");
}
}
public class Tiger extends Cat {
@Override
public void run() {
System.out.println("Тигр бежит со speedю 60 км/ч");
}
}
public class Cheetah extends Cat {
@Override
public void run() {
System.out.println("Гепард бежит со speedю до 120 км/ч");
}
}
所以我们有3节课。让我们模拟一种情况,我们可以像他们是同一类一样与他们一起工作。让我们想象一下,我们的一只猫生病了,需要艾博利特医生的帮助。让我们尝试创建一个Aibolit
能够治疗狮子、老虎和猎豹的类。
public class Aibolit {
public void healLion(Lion lion) {
System.out.println("Лев здоров!");
}
public void healTiger(Tiger tiger) {
System.out.println("Тигр здоров!");
}
public void healCheetah(Cheetah cheetah) {
System.out.println("Гепард здоров!");
}
}
看起来问题已经解决了——类已经编写完毕并且可以使用了。但如果我们想扩展我们的计划,我们该怎么办呢?现在我们只有3个物种:狮子、老虎和猎豹。但世界上有40多种猫。想象一下,如果我们在程序中为帕拉斯猫、美洲虎、缅因猫、家猫和其他猫添加单独的类别,将会发生什么。 当然,程序本身会起作用,但班级Aibolit
必须不断添加新的方法来治疗每种类型的猫,结果它将增长到前所未有的规模。这就是多态性的特性发挥作用的地方——“处理多种类型的能力,就好像它们是同一类型一样。” 我们不需要创建无数的方法来做同样的事情——治疗猫。一种方法足以同时满足所有情况:
public class Aibolit {
public void healCat(Cat cat) {
System.out.println("Пациент здоров!");
}
}
healCat()
我们可以将对象Lion
和Tiger
对象传递 给该方法Cheetah
- 它们都是Cat
:
public class Main {
public static void main(String[] args) {
Aibolit aibolit = new Aibolit();
Lion simba = new Lion();
Tiger sherekhan = new Tiger();
Cheetah chester = new Cheetah();
aibolit.healCat(simba);
aibolit.healCat(sherekhan);
aibolit.healCat(chester);
}
}
控制台输出:
Пациент здоров!
Пациент здоров!
Пациент здоров!
这就是我们的类Айболит
可以处理不同类型的方式,就好像它们是同一类型一样。现在让我们处理第二部分:“在这种情况下,对象的行为将根据它们所属的类型而有所不同。” 这里的一切也很简单。在自然界中,所有猫的奔跑方式都不同。至少,他们的跑步速度是不同的。在我们的三种宠物中,猎豹跑得最快,而老虎和狮子跑得较慢。也就是说,他们的行为是不同的。多态性不仅使我们能够将不同的类型合而为一。同时,它使我们不会忘记他们的差异,并保留他们每个人特有的行为。通过这个例子就可以理解这一点。假设在成功康复后,我们的猫决定跑来跑去庆祝一下。让我们将其添加到我们的类中Aibolit
:
public class Aibolit {
public void healCat(Cat cat) {
System.out.println("Пациент здоров!");
cat.run();
}
}
让我们尝试运行相同的代码来治疗三种动物:
public static void main(String[] args) {
Aibolit aibolit = new Aibolit();
Lion simba = new Lion();
Tiger sherekhan = new Tiger();
Cheetah chester = new Cheetah();
aibolit.healCat(simba);
aibolit.healCat(sherekhan);
aibolit.healCat(chester);
}
结果如下:
Пациент здоров!
Лев бежит со speedю 80 км/ч
Пациент здоров!
Тигр бежит со speedю 60 км/ч
Пациент здоров!
Гепард бежит со speedю до 120 км/ч
在这里,我们清楚地看到,尽管我们将所有三种动物传递到一个方法中,并将它们“概括”为 ,但我们的对象的特定行为被保留了Cat
。由于多态性,Java 完美地记住了这不仅仅是三只猫,而是一只狮子、一只老虎和一只猎豹,它们的奔跑方式不同。这是使用多态性的主要优点——灵活性。当我们需要创建一些多种类型共有的功能时,狮子、老虎和猎豹就会变成“猫”。所有动物都是不同的,但在某些情况下 - 猫就是猫,无论它属于什么物种:) 这是为您提供的视频确认。
run()
适用于所有 40 种猫。
GO TO FULL VERSION