Java的多態淺談

摘要: Java的多態淺談概述Java的四大基本特性:抽象,封裝,繼承和多態。其中,抽象,封裝,繼承能夠說多態的基礎,而多態是封裝,繼承的具體表現。若是非要用專業術語來描述什麼是多態的話 多態是指程序中定義的引用變量所指向具體類型和經過該引用變量發出的方法調用在編譯的時候並不肯定,而是程序運行期間才肯定,就是說一個引用變量到底指向哪個類的實例對象,該引用變量發出的方法調用哪個類的中的方法,必須在程序運行期間才能肯定。編程

概述設計模式

Java的四大基本特性:抽象,封裝,繼承和多態。其中,抽象,封裝,繼承能夠說多態的基礎,而多態是封裝,繼承的具體表現。若是非要用專業術語來描述什麼是多態的話

多態是指程序中定義的引用變量所指向具體類型和經過該引用變量發出的方法調用在編譯的時候並不肯定,而是程序運行期間才肯定,就是說一個引用變量到底指向哪個類的實例對象,該引用變量發出的方法調用哪個類的中的方法,必須在程序運行期間才能肯定。
記得大學時老師講多態舉的一個例子:上課鈴響了,同窗們都回各自教室上課,這就是多態。這就完了?若是是剛接觸編程的同窗來講,估計都懵逼了,咱們那時就是這種狀態。接下來咱們用代碼實現下老師說的意思。
多態實例
//上課鈴響了
public class Ring
{
[Java] 純文本查看 複製代碼
?函數

public void ringSound()/size/color{設計

System.out.println("我是鈴聲!!!");

}code

}
1班的同窗聽到鈴聲回去上語文課
public class ClassRoom1 extends Ring
{
[Java] 純文本查看 複製代碼
?對象

public void ringSound()
{繼承

System.out.println("classRoom1的同窗聽到鈴聲上語文了!!!");

}
}
2班的同窗聽到鈴聲回去上英語課
public class ClassRoom2 extends Ring
{
[Java] 純文本查看 複製代碼
?編譯

public void ringSound()
{class

System.out.println("classRoom2的同窗聽到鈴聲上英語了!!!");

}
}
Main類
public class Main
{
[Java] 純文本查看 複製代碼
?基礎

public static void main(String[] args)
{

Ring ring = new ClassRoom1();
Ring ring1 = new ClassRoom2();
ring.ringSound();
ring1.ringSound();

}
}
輸出
classRoom1的同窗聽到鈴聲上語文了!!!
classRoom2的同窗聽到鈴聲上英語了!!!
這就是一個簡單的的多態例子,咱們從中不難發現,多態存在的幾個關鍵點,
有繼承關係(extends)
子類重寫父類方法(ringSound)
父類引用指向子類對象 Ring ring = new ClassRoom1()
如今咱們改下例子,看出現什麼狀況
public class Ring
{
[Java] 純文本查看 複製代碼
?

public static void ringSound()/size/color{

System.out.println("我是鈴聲!!!");

}

[Java] 純文本查看 複製代碼
?

}

這時發現ClassRoom1 和 ClassRoom2 都報錯了,那咱們也給他們都加上static

public class ClassRoom1 extends Ring
{

[Java] 純文本查看 複製代碼
?

public static void ringSound()
{

System.out.println("classRoom1的同窗聽到鈴聲上語文了!!!");

}

}
ClassRoom2類
public class ClassRoom2 extends Ring
{
[Java] 純文本查看 複製代碼
?

public static void ringSound()
{

System.out.println("classRoom2的同窗聽到鈴聲上英語了!!!");

}
}
預編譯沒報錯了,那麼輸出應該是剛纔的結果,main函數跑起來,輸出
我是鈴聲!!!
我是鈴聲!!!
能夠發現,結果並非咱們所想的那樣。咱們能夠得出一個結論:在Java中static修飾的函數不能被子類重寫。
其實Java中,父類含有一個靜態函數,並且在他的子類也一樣有一個返回類型,函數名,參數列表都相同的靜態函數,子類實際上只是將父類中的該同名函數進行隱藏,而非重寫,他們兩個是徹底沒有關係的函數,因此他們的行爲並不具備多態性。
注意:就是被final修飾的父類函數是沒法被重寫和private修飾的父類函數沒法被繼承。這是Java的規定,就不在舉例說明
多態的做用
說了這麼多,多態有什麼做用
解耦,各類設計模式大可能是基於多態實現的
複用性,子類處理父類便可
擴充和維護
多態缺點:不能使用子類的特有屬性和行爲。
多態分類
爲了肯定執行多態函數的哪個,因此有兩種狀況:編譯時多態,運行時多態
函數重載都是編譯時多態,根據實際參數的數據類型,個數和順序,Java在編譯時就可以肯定執行重載函數中的哪個。
函數重寫表現出兩種多態性,當對象引用本類實例時,爲編譯時多態,不然爲運行時多態。
public class Ring
{
[Java] 純文本查看 複製代碼

public void ringSound()
{

System.out.println("我是鈴聲!!!");

}
花木蘭替父親花弧從軍。那麼這時候花木蘭是子類,花弧是父類。花弧有本身的成員屬性年齡,姓名,性別。花木蘭也有這些屬性,可是很明顯兩者的屬性徹底不同。花弧有本身的非靜態成員方法‘騎馬殺敵’,一樣花木蘭也遺傳了父親同樣的方法‘騎馬殺敵’。花弧還有一個靜態方法‘自我介紹’,每一個人均可以問花弧姓甚名誰。同時花木蘭還有一個本身特有的非靜態成員方法‘塗脂抹粉’。可是,如今花木蘭替父從軍,女扮男裝。這時候至關於父類的引用(花弧這個名字)指向了子類對象(花木蘭這我的),那麼在其餘類(其餘的人)中訪問子類對象(花木蘭這我的)的成員屬性(姓名,年齡,性別)時,其實看到的都是花木蘭她父親的名字(花弧)、年齡(60歲)、性別(男)。當訪問子類對象(花木蘭這我的)的非靜態成員方法(騎馬打仗)時,其實都是看到花木蘭本身運用十八般武藝在騎馬打仗。當訪問花木蘭的靜態方法時(自我介紹),花木蘭本身都是用她父親的名字信息在向別人做自我介紹。而且這時候花木蘭不能使用本身特有的成員方法‘塗脂抹粉’。 -----------多態中的向上造型
那麼終於一將功成萬骨枯,打仗旗開得勝了,花木蘭告別了戰爭生活。有一天,遇到了本身心愛的男人,這時候愛情的力量將父類對象的引用(花弧這個名字)強制轉換爲子類對象原本的引用(花木蘭這個名字),那麼花木蘭又重新成爲了她本身,這時候她徹底是她本身了。名字是花木蘭,年齡是28,性別是女,打仗依然那樣生猛女漢子,自我介紹則堂堂正正地告訴別人我叫花木蘭。OMG!終於,終於可使用本身特有的成員方法‘塗脂抹粉’了。今後,花木蘭徹底回到了替父從軍前的那個花木蘭了。而且和本身心愛的男人幸福的過完了一輩子。 ------多態中的向下轉型
花弧
public class HuaHu
{
[Java] 純文本查看 複製代碼
?

int age = 60;/size/color
String name = "花弧";

String sex = "男";

public void horseKillEnemy()
{

System.out.println("騎馬殺敵");

}

public static void suggest()
{

System.out.println("我叫花弧");

}
}
花木蘭
public class HuaMuLan extends HuaHu
{
[Java] 純文本查看 複製代碼
?

String name = "花木蘭";

int age = 28;

String sex = "女";

public void horseKillEnemy()
{

System.out.println("花木蘭騎馬殺敵");

}

public void Prettify()
{

System.out.println("花木蘭塗脂抹粉");

}
}
替父從軍
public class Main
{
[Java] 純文本查看 複製代碼
?

public static void main(String[] args)
{

//替父從軍
HuaHu huaHu = new HuaMuLan();
System.out.println("姓名:" + huaHu.name + ",年齡:" + huaHu.age + ",性別:" + huaHu.sex); //其餘人

huaHu.horseKillEnemy();

huaHu.suggest();  //用她父親的名字信息在向別人做自我介紹

//huaHu.Prettify() //沒法使用

//  戰爭結束了
HuaMuLan huaMuLan = (HuaMuLan)huaHu;
//花木蘭變回本身
System.out.println("姓名:" + huaMuLan.name + ",年齡:" + huaMuLan.age + ",性別:" + huaMuLan.sex);
//本身特有函數
huaMuLan.Prettify();

System.out.println("幸福的過完了一輩子");

}}輸出姓名:花弧,年齡:60,性別:男花木蘭騎馬殺敵我叫花弧姓名:花木蘭,年齡:28,性別:女花木蘭塗脂抹粉幸福的過完了一輩子

相關文章
相關標籤/搜索