你好!今天我們即將完成一系列關於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