父類引用指向子類物件

2021-05-26 13:03:48 字數 1412 閱讀 1989

要理解多型性,首先要知道什麼是「向上轉型」。

我定義了乙個子類cat,它繼承了animal類,那麼後者就是前者是父類。我可以通過   cat c = new cat(); 例項化乙個cat的物件,這個不難理解。

但當我這樣定義時:   animal a = new cat(); 這代表什麼意思呢?      

很簡單,它表示我定義了乙個animal型別的引用,指向新建的cat型別的物件。由於cat是繼承自它的父類animal,所以animal型別的引用是可以指向cat型別的物件的。

那麼這樣做有什麼意義呢?因為子類是對父類的乙個改進和擴充,所以一般子類在功能上較父類更強大,屬性較父類更獨特,   定義乙個父類型別的引用指向乙個子類的物件既可以使用子類強大的功能,又可以抽取父類的共性。  

所以,父類型別的引用可以呼叫父類中定義的所有屬性和方法,而對於子類中定義而父類中沒有的方法,它是無可奈何的;   同時,父類中的乙個方法只有在在父類中定義而在子類中沒有重寫的情況下,才可以被父類型別的引用呼叫;   對於父類中定義的方法,如果子類中重寫了該方法,那麼父類型別的引用將會呼叫子類中的這個方法,這就是動態連線。     

看下面這段程式:  

class father 

// 這是父類中的func2()方法,因為下面的子類中重寫了該方法

//所以在父類型別的引用中呼叫時,這個方法將不再有效,取而代之的是將呼叫子類中重寫的func2()方法

public void func2()

}class child extends father

// func2()重寫了父類father中的func2()方法

// 如果父類型別的引用中呼叫了func2()方法,那麼必然是子類中重寫的這個方法

public void func2()

}public class polymorphismtest

}

上面的程式是個很典型的多型的例子。子類child繼承了父類father,並過載了父類的func1()方法,重寫了父類的func2()方法。過載後的func1(int i)和func1()不再是同乙個方法,由於父類中沒有func1(int i),那麼,父類型別的引用child就不能呼叫func1(int i)方法。而子類重寫了func2()方法,那麼父類型別的引用child在呼叫該方法時將會呼叫子類中重寫的func2()。

那麼該程式將會列印出什麼樣的結果呢?       很顯然,應該是「ccc」。      

對於多型,可以總結它為:        

一、使用父類型別的引用指向子類的物件;      

二、該引用只能呼叫父類中定義非private的方法和變數,當試圖呼叫子類中新增的變數時出錯

三、如果子類中重寫了父類中的乙個方法,那麼在呼叫這個方法的時候,將會呼叫子類中的這個方法;(動態連線、動態呼叫);沒有則呼叫父類中的方法;     

父類引用指向子類物件

是多型的一種實現方式 這樣做使程式靈活性更好,若有多個子類,只需改變引用就能實現不同的功能,而不需要改變程式 父類 a 子類 a1,a2 a obj1 new a1 a obj2 new a2 如果a有乙個方法是show 子類實現了show 那麼obj1.show 就是第乙個子類的show obj2...

父類引用指向子類物件

package fuleiyinyongzhixiang public class animal public void sleep package fuleiyinyongzhixiang public class person extends animal public void play pa...

關於父類引用指向子類物件

例如 有以下2個類 public class father public class son father father f new son 這種用法叫做 父類引用指向子類物件,或者叫 父類指標指向子類物件 指的是定義乙個父類的引用,而它實際指向的是子類建立的物件。好處是什麼?下面做幾個測試,第一種...