更新時(shí)間:2022-11-28 11:53:06 來源:動(dòng)力節(jié)點(diǎn) 瀏覽1472次
Cat c = new Cat();
實(shí)例化一個(gè)Cat的對(duì)象,這個(gè)不難理解。但當(dāng)這樣定義時(shí): 這代表什么意思呢? 很簡(jiǎn)單,它表示我定義了一個(gè)Animal類型的引用,指向新建的Cat類型的對(duì)象。由于Cat是繼承自它的父類Animal,所以Animal類型的引用是可以指向Cat類型的對(duì)象的。那么這樣做有什么意義呢?因?yàn)樽宇愂菍?duì)父類的一個(gè)改進(jìn)和擴(kuò)充,所以一般子類在功能上較父類更強(qiáng)大,屬性較父類更獨(dú)特, 定義一個(gè)父類類型的引用指向一個(gè)子類的對(duì)象既可以使用子類強(qiáng)大的功能,又可以抽取父類的共性。 所以,父類類型的引用可以調(diào)用父類中定義的所有屬性和方法,而對(duì)于子類中定義而父類中沒有的方法,它是無可奈何的; 同時(shí),父類中的一個(gè)方法只有在在父類中定義而在子類中沒有重寫的情況下,才可以被父類類型的引用調(diào)用; 對(duì)于父類中定義的方法,如果子類中重寫了該方法,那么父類類型的引用將會(huì)調(diào)用子類中的這個(gè)方法,這就是動(dòng)態(tài)連接。 看下面這段程序: 上面的程序是個(gè)很典型的Java多態(tài)性的例子。子類Child繼承了父類Father,并重載了父類的func1()方法,重寫了父類的func2()方法。重載后的func1(int i)和func1()不再是同一個(gè)方法,由于父類中沒有func1(int i),那么,父類類型的引用child就不能調(diào)用func1(int i)方法。而子類重寫了func2()方法,那么父類類型的引用child在調(diào)用該方法時(shí)將會(huì)調(diào)用子類中重寫的func2()。
Animal a = new Cat();
class Father{
public void func1(){
func2();
}
//這是父類中的func2()方法,因?yàn)橄旅娴淖宇愔兄貙懥嗽摲椒?
//所以在父類類型的引用中調(diào)用時(shí),這個(gè)方法將不再有效
//取而代之的是將調(diào)用子類中重寫的func2()方法
public void func2(){
System.out.println("AAA");
}
}
class Child extends Father{
//func1(int i)是對(duì)func1()方法的一個(gè)重載
//由于在父類中沒有定義這個(gè)方法,所以它不能被父類類型的引用調(diào)用
//所以在下面的main方法中child.func1(68)是不對(duì)的
public void func1(int i){
System.out.println("BBB");
}
//func2()重寫了父類Father中的func2()方法
//如果父類類型的引用中調(diào)用了func2()方法,那么必然是子類中重寫的這個(gè)方法
public void func2(){
System.out.println("CCC");
}
}
public class PolymorphismTest {
public static void main(String[] args) {
Father child = new Child();
child.func1();//打印結(jié)果將會(huì)是什么?
}
}
相關(guān)閱讀
0基礎(chǔ) 0學(xué)費(fèi) 15天面授
有基礎(chǔ) 直達(dá)就業(yè)
業(yè)余時(shí)間 高薪轉(zhuǎn)行
工作1~3年,加薪神器
工作3~5年,晉升架構(gòu)
提交申請(qǐng)后,顧問老師會(huì)電話與您溝通安排學(xué)習(xí)