我定義了一個子類Cat,它繼承了Animal類,那麼後者就是前者是父類。我可以通過
Cat c = new Cat();
實例化一個Cat對象,這個不難理解。但當我這樣定義時:
Animal a = new Cat();
這樣代表什麼意思呢?
我定義了一個Animal類型的引用,指向新建的Cat類型的對象。由於Cat是繼承自它的父類Animal,所以Animal類型的引用是可以指向Cat類型的對象的。那麼這樣做有什麼意義呢?因爲子類是對父類的一個改進和擴充,所以一般子類在功能上較父類更強大,屬性較父類更獨特:
定義一個父類類型的引用指向一個子類的對象既可以使用子類強大的功能,又可以抽取父類的共性。
所以,父類類型的引用可以調用父類中定義的所有屬性和方法,而對於子類中定義而父類中沒有的方法,它是無可奈何的;
對於父類中定義的方法,如果子類中重寫了該方法,那麼父類類型的引用將會調用子類中的這個方法,這就是動態連接。
來我們舉個栗子:
class Father {
public void func1(){
func2();
}
public void func2(){
System.out.println("AAA");
}
}
class Child extends Father{
public void func1(int i){
System.out.println("BBB");
}
public void func2(){
System.out.println("CCC");
}
}
public class Test {
public static void main(String[] args) {
Father child = new Child();
child.func1();//打印結果將會是什麼?
}
}
上面的程序是個很典型的多態的例子。子類Child繼承了父類Father,並重載了父類的func1()方法,重寫了父類的func2()方法。重載後的func1(int i)和func1()不再是同一個方法,由於父類中沒有func1(int i),那麼,父類類型的引用child就不能調用func1(int i)方法。而子類重寫了func2()方法,那麼父類類型的引用child在調用該方法時將會調用子類中重寫的func2()。
————————————————
版權聲明:本文爲CSDN博主「Allen_forv」的原創文章,遵循 CC 4.0 BY-SA 版權協議,轉載請附上原文出處鏈接及本聲明。
原文鏈接:https://blog.csdn.net/Allen_forv/article/details/80771650