多態,當前指的是 java 所呈現出來的一個對象
?
多態
?
定義
?
多態是指同一個行為具有多個不同表現形式或形態的能力。在面向對象編程中,多態通過方法重載和方法重寫來實現。
強弱類型語言
?javascript 或者python 是弱類型語言
C 語言,或者 C++也好,是強類型語言
?
通俗來講,強類型語言是指當前的數據類型是確定好了的,每次賦值必須要用表示該類型的特定字符,否則報錯,反之則為弱類型語言
java /C /C++ 等,當中的數據類型,它決定數據在內存當中的存儲形式。
對于 python /javascript等,沒有什么數據類型,統一用一個變量(如var)代替所有的數據類型
PS:繼承的本質是代碼的復用,而代碼復用的實現方式就是能夠調用父類的變量和方法
方法重載
?
概念:在同一個類中,允許存在多個同名方法,但這些方法的參數列表不同(參數個數、類型或順序不同)。
?
public class Calculator {
? ? public int add(int num1, int num2) {
? ? ? ? return num1 + num2;
? ? }
? ? public double add(double num1, double num2) {
? ? ? ? return num1 + num2;
? ? }
}
?
?
在上述代碼中,?Calculator?類有兩個?add?方法,通過參數類型的不同來區分。
?
方法重寫
?
概念:子類重寫父類中已有的方法。要求方法名、參數列表和返回值類型必須與父類中被重寫的方法一致(在Java中,返回值類型可以是父類返回值類型的子類,這是協變返回類型)。
?
class Animal {
? ? public void makeSound() {
? ? ? ? System.out.println("動物xxxxxx");
? ? }
}
class Dog extends Animal {
? ? @Override
? ? public void makeSound() {
? ? ? ? System.out.println("汪汪汪");
? ? }
}
?
?
這里?Dog?類重寫了?Animal?類的?makeSound?方法。
如下圖:
由圖可知,B繼承自A,C、D繼承自B,從Test的main方法可推斷
1、"A and A"
? ? ? a1這個變量引用的是A類型,b引用的是B類型,B繼承自A,A中有兩個方法,分別要輸入參數A和D,B繼承于A,此時B的類型向上轉型為A,則此時a1.Show(b)即為A.Show(A),結果為A and A
2、"A and A"
? ? ?同理1,C繼承自B,向上轉型至B,但沒有以B為參數的方法則再次向上轉型為A
3、"A and D"
? ? ?A中就把本來就含有以D為參數的方法,則不會轉型,此時會直接調用輸出A and D
4、"B and A"
? ? ?a2引用B方法,B繼承自A,所以理論上來說a2可以同時調用AB中的4個方法,但是B會對A中的Show(A)方法進行重寫。所以b調用的B方法由B向上轉型為A后,輸出的結果為B and A
5、"B and A"
? ?同理1,C繼承自B,向上轉型至B,但沒有以B為參數的方法則再次向上轉型為A,B對A中的Show(A)方法進行重寫,輸出B and A
6、"A and D"
? ?同理3,對Show(A)改寫但對Show(D)無影響,輸出A and D
7、"B and A"
? ??同理4
9、”A and D“
? ? 同理3,對Show(A)改寫但對Show(D)無影響,輸出A and D