-
1 # 加拿大茶小二
-
2 # IT資訊i
百度搜索圈T社群 免費行業影片教程
www.aiquanti.com
多型,就是過載和重寫.過載發生在一個類中.重寫發生在子類,意思就是子類重寫父類相同名稱的方法.剛學語言有的東西,不必搞得那麼清楚,只有知道怎麼用就行了,有的問題你要想真正把它搞得很懂,短時間是不可能的,比如說介面,沒有幾年工作經驗你根本不可能真正理解什麼是介面,甚至有的人工作四,五年也沒搞明白什麼是介面,不要花太多時間去搞這些不容易搞懂的問題.
過載的特性,方法名相同.返回型別,傳入方法的引數不同(包括個數和型別).
重寫的特性,方法名相同,返回型別,引數均相同,必須發生在子類.
1.Java語言允許某個型別的引用變數引用子類的例項,而且可以對這個引用變數進行型別轉換。
Animal animal=new Dog(); //引用變數animal引用一個Animal子類Dog的例項
Dog dog=(Dog)animal; //向下轉型,把Animal型別轉換為Dog型別
Creature creature=animal; //向上轉型,把Animal型別轉換為 Creature型別
animal=new Cat(); //引用變數animal引用另一個Animal子類Cat的例項
注:Creature這裡指的是生物。
2.如果把引用變數轉換為子類型別,稱為向下轉型,如果把引用變數轉換為父類型別,稱為向上轉型。
3.在進行引用變數的型別轉換時,會受到各種限制。而且在透過引用變數訪問它所引用的例項的靜態屬性、靜態方法、例項屬性、例項方法,以及從父類中繼承的方法和屬性時,Java虛擬機器會採用不同的繫結機制。
4.成員變數、靜態方法按照引用變數宣告的型別靜態繫結;例項方法按照引用變數引用的例項動態繫結。
例如,對於以下這段程式碼:
Fathers f=new Sons();
System.out.println(“f.var=”+f.var);
System.out.println(“f.staticVar=”+f.staticVar);
f.method();
f.staticMethod();
執行時將會輸出如下結果:
f.var=FatherVar
f.staticVar=StaticFaterVar
Son method
Static Father method
class Fathers{
String var="FatherVar";
static String staticVar="StaticFatherVar";
void method(){System.out.println("Father method");}
static void staticMethod(){System.out.println("Static Father method");}
}
class Sons extends Fathers{
String var="SonVar";
static String staticVar="StaticSonVar";
void method(){System.out.println("Son method");}
static void staticMethod(){System.out.println("Static Son method");}
String sonVar=null;
void sonMethod(){}
}
-
3 # hallojava
多型分為編譯時多型和執行時多型。
1.編譯時多型,其實就是方法過載,相同函式名,但簽名不相同。值得注意的是簽名不包括方法返回值,換句話說,兩個方法,函式名和入參都相同,但返回值不同,編譯器回報錯的。
2.執行時多型,其實就和繼承和介面實現相關了,子類可以覆蓋父類的非final,非static,非private方法或者實現介面方法。執行時,動態繫結例項到父類或介面的引用,那jvm是怎麼知道呼叫哪個子類的例項的對應方法的呢?這就是你問的問題了——Java中物件在jvm內部都有描述元資料,物件頭,物件頭中儲存了當前例項的型別資訊,呼叫時jvm就根據這個type能精確找到具體是點用哪個子類的方法了。
回覆列表
父類指標指向子類物件,就是多型了。
比如A是父類,B和C都是繼承於A
B b = new B();
那A a = b;
就是多型了。