1.多態的語法規則
多態是面對對象編程思想中的第三大特性,用通俗的話來解釋,多態其實就是:
- 同樣的一段代碼可以實現不同的功能。
用專業的話來解釋多態:
- 一個父類的引用類型變量它既可以指向父類對象,也可以指向子類對象(子類的引用類型變量不能指向父類),它可以根據當前時刻指向對象的不同,自動調用不同對象的方法。
舉個例子,在現實生活中,當上課鈴響起後,所有的學生都執行進教室這個相同的操作,但是不同班級的學生會自動進入不同的教室,這就是多態。
多態的測試程序如下:
/**
* @brief 測試多態的語法規則
* @author mculover666
* @date 2019/4/29
*/
class A
{
public void fun()
{
System.out.println("I am Fun of class A.");
}
}
class B extends A
{
/* 重寫父類的fun方法 */
public void fun()
{
System.out.println("I am Fun of class B.");
}
}
class TestPoly1
{
public static void main(String[] args)
{
A a1 = new A();
B b1 = new B();
a1.fun(); //a1是A類對象的引用,所有調用A類的fun方法
b1.fun(); //b1是B類對象的引用,所有調用B類的fun方法
/**
* 核心知識:多態,同樣的a1.fun(),功能卻不一樣
*/
a1 = b1; //將子類的引用發送給父類的引用
a1.fun(); //a1變成子類B類對象的引用,調用B類的fun方法
}
}
測試結果:
2.多態的實際用途
多態的實際用途其實就是:相同的一段代碼,實現不同的功能。
問題
A類派生出B類,B類派生出C類,依次派生形成A類的一個族羣,編寫一個函數,調用整個A類族羣所有對象的fun方法。
分析
因爲A類是A類族所有類的父類,所以A類的引用類型變量可以指向A類及A類所有子類的對象,所以使用多態特性編寫的函數如下:
public static void fun(A aa)
{
/**
* 多態:同樣的代碼,根據aa的指向對象不同,自動調用不同對象的fun方法
*/
aa.fun();
}
解決
/**
* @brief 編寫一個方法,調用整個A類族的fun方法
* @author mculover666
* @date 2019/4/29
*/
class A
{
public void fun()
{
System.out.println("I am Fun of class A.");
}
}
class B extends A
{
/* 重寫父類的fun方法 */
public void fun()
{
System.out.println("I am Fun of class B.");
}
}
class C extends B
{
/* 重寫父類的fun方法 */
public void fun()
{
System.out.println("I am Fun of class C.");
}
}
class D extends C
{
/* 重寫父類的fun方法 */
public void fun()
{
System.out.println("I am Fun of class D.");
}
}
class TestPoly2
{
/* 在靜態的main方法中被調用,所以必須爲靜態方法,否則不能被調用 */
public static void fun(A aa)
{
/**
* 多態:同樣的代碼,根據aa的指向對象不同,自動調用不同對象的fun方法
*/
aa.fun();
}
public static void main(String[] args)
{
A a1 = new A();
B b1 = new B();
C c1 = new C();
D d1 = new D();
fun(a1);
fun(b1);
fun(c1);
fun(d1);
}
}
運行結果如下:
3.多態使用時的注意事項
- 子類對象可以直接賦給父類對象的引用,但是在任何情況下,父類對象都不能直接賦給子類對象的引用;
- 通過父類引用只能訪問子類從父類繼承過來的成員;
- 通過父類引用不能訪問子類對象特有的成員;
- 只有在父類的引用本身已經在指向子類對象時,纔可以進行強制轉化,強制將父類引用轉化爲子類引用;
接收更多精彩文章及資源推送,歡迎訂閱我的微信公衆號:『mculover666』。