JAVA多態(tài)及其原理


1借浊、什么是多態(tài)塘淑?

概念:同一操作作用于不同的對象,可以有不同的解釋蚂斤,產(chǎn)生不同的執(zhí)行結(jié)果存捺,這就是多態(tài)性。簡單的說: “一個接口曙蒸,多種實現(xiàn)”捌治。

2、為什么要用多態(tài)呢纽窟?

原因:我們知道肖油,封裝可以隱藏實現(xiàn)細(xì)節(jié),使得代碼模塊化臂港;繼承可以擴(kuò)展已存在的代碼模塊(類)森枪;它們的目的都是為了——代碼重用视搏。而多態(tài)除了代碼的復(fù)用性外,還可以解決項目中緊偶合的問題,提高程序的可擴(kuò)展性.县袱。耦合度講的是模塊模塊之間浑娜,代碼代碼之間的關(guān)聯(lián)度,通過對系統(tǒng)的分析把他分解成一個一個子模塊式散,子模塊提供穩(wěn)定的接口筋遭,達(dá)到降低系統(tǒng)耦合度的的目的,模塊模塊之間盡量使用模塊接口訪問暴拄,而不是隨意引用其他模塊的成員變量漓滔。

3、多態(tài)在什么地方用揍移?

可以用在方法的參數(shù)中和方法的返回類型中次和。
在方法中的參數(shù),請看下面的例子:

public abstract class Driver{
    public void run();//讓子類來運行
}
class SBenz extends Driver{
    public void run(){
        Console.WriteLine("Benz在以200邁的速度在run");
    }
}
 class JD extends Driver{
    public void run(){
        Console.WriteLine("JD is running...");
    }
 }
 class Person{
    private Driver driver;
    public Person(){
        
    }
    public Person(Driver driver){
        this.driver = driver;
    }
    public void drive(){
        driver.run();
    }
    public void setDriver(Driver driver){
        //運用參數(shù)多態(tài),以后不管買什么車都可以
        this.driver = driver;
    }
 }
 static void Main(string[] args){
        Person p = new Person();
        JD jd = new JD();//剛開始沒錢就買輛JD吧
        p.setDriver(jd);
        p.drive();
        SBenz benz = new SBenz();//有錢換車了
        p.setDriver(benz);
        p.drive();
 }

在方法的返回類型中那伐,請看下面的例子(工廠模式):

public class CarFactory{
    public Driver factory(String carName){
        if (carName.Equals("JD")){
            return new JD();
        } else if (carName.Equals("Benz")){
            return new SBenz();
        } else {
            Console.WriteLine("對不起,不伺候");
            return null;
        }
    }
 }

4踏施、實現(xiàn)原理:動態(tài)綁定

JVM 運行時結(jié)構(gòu)

Java 的方法調(diào)用有兩類,動態(tài)方法調(diào)用與靜態(tài)方法調(diào)用罕邀。靜態(tài)方法調(diào)用是指對于類的靜態(tài)方法的調(diào)用方式畅形,是靜態(tài)綁定的;而動態(tài)方法調(diào)用需要有方法調(diào)用所作用的對象诉探,是動態(tài)綁定的日熬。類調(diào)用 (invokestatic) 是在編譯時刻就已經(jīng)確定好具體調(diào)用方法的情況,而實例調(diào)用 (invokevirtual) 則是在調(diào)用的時候才確定具體的調(diào)用方法肾胯,這就是動態(tài)綁定竖席,也是多態(tài)要解決的核心問題。

相關(guān)面試題

class A { 
     public String show(D obj)...{ 
        return ("A and D"); 
     } 
     public String show(A obj)...{ 
        return ("A and A"); 
     } 
} 
class B extends A{ 
     public String show(B obj)...{ 
        return ("B and B"); 
     } 
     public String show(A obj)...{ 
        return ("B and A"); 
     } 
} 
class C extends B...{} 
class D extends B...{}

問題:以下輸出結(jié)果是什么敬肚?

A a1 = new A();
    A a2 = new B();
    B b = new B();
    C c = new C();
    D d = new D();
    System.out.println(a1.show(b));   ①
    System.out.println(a1.show(c));   ②
    System.out.println(a1.show(d));   ③
    System.out.println(a2.show(b));   ④
    System.out.println(a2.show(c));   ⑤
    System.out.println(a2.show(d));   ⑥
    System.out.println(b.show(b));     ⑦
    System.out.println(b.show(c));     ⑧
    System.out.println(b.show(d));     ⑨

答案

          ①   A and A
          ②   A and A
          ③   A and D
          ④   B and A
          ⑤   B and A
          ⑥   A and D
          ⑦   B and B
          ⑧   B and B
          ⑨   A and D

分析:

做這種題的話要時時刻刻使用那個優(yōu)先級順序: 優(yōu)先級從高到低:this.show(O)毕荐、super.show(O)、this.show((super)O)艳馒、super.show((super)O)憎亚。
①,②,③調(diào)用a1.show()方法,a1 屬于A類弄慰,A類有兩個方法show(D obj)和show(A obj)第美。①a1.show(b),參數(shù)b為A類的子類對象陆爽,這里為向上轉(zhuǎn)型什往,相當(dāng)于A obj=b;所以調(diào)用show(A obj)方法慌闭,得到A and A結(jié)果别威。②同理第献,③參數(shù)為d,調(diào)用show(D obj),得到A and D兔港。
④,⑤仔拟,⑥調(diào)用a2.show()方法衫樊,A a2 = new B();是向上轉(zhuǎn)型,所以對a2方法的調(diào)用利花,使用A1類的方法show(D obj)和show(A obj)科侈,但此時show(A obj)已經(jīng)被重寫為return ("B and A"), ④a2.show(b)炒事,調(diào)用show(A obj)臀栈,得到B and A。⑤同理挠乳,⑥調(diào)用show(D obj)权薯,得到A and D。
⑦睡扬,⑧盟蚣,⑨調(diào)用b.show()方法,b為B類,B類的show方法有繼承的show(D obj)卖怜,自己的兩個show(B obj)屎开、show(A obj)。
⑦調(diào)用show(B obj)马靠,得到B and B奄抽,⑧向上轉(zhuǎn)型,調(diào)用show(B obj)甩鳄,得到B and B⑨show(D obj)逞度,得到A and D

參考文獻(xiàn)

[1]Java多態(tài)性理解
[2]java提高篇之理解java的三大特性——多態(tài)
[3]java多態(tài)實現(xiàn)原理
[4]深入理解java多態(tài)性

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末,一起剝皮案震驚了整個濱河市娩贷,隨后出現(xiàn)的幾起案子第晰,更是在濱河造成了極大的恐慌,老刑警劉巖彬祖,帶你破解...
    沈念sama閱讀 217,657評論 6 505
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件茁瘦,死亡現(xiàn)場離奇詭異,居然都是意外死亡储笑,警方通過查閱死者的電腦和手機(jī)甜熔,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 92,889評論 3 394
  • 文/潘曉璐 我一進(jìn)店門,熙熙樓的掌柜王于貴愁眉苦臉地迎上來突倍,“玉大人,你說我怎么就攤上這事〈酰” “怎么了捌蚊?”我有些...
    開封第一講書人閱讀 164,057評論 0 354
  • 文/不壞的土叔 我叫張陵,是天一觀的道長依痊。 經(jīng)常有香客問我,道長,這世上最難降的妖魔是什么炼团? 我笑而不...
    開封第一講書人閱讀 58,509評論 1 293
  • 正文 為了忘掉前任,我火速辦了婚禮疏尿,結(jié)果婚禮上瘟芝,老公的妹妹穿的比我還像新娘。我一直安慰自己褥琐,他們只是感情好锌俱,可當(dāng)我...
    茶點故事閱讀 67,562評論 6 392
  • 文/花漫 我一把揭開白布。 她就那樣靜靜地躺著敌呈,像睡著了一般贸宏。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上驱富,一...
    開封第一講書人閱讀 51,443評論 1 302
  • 那天锚赤,我揣著相機(jī)與錄音,去河邊找鬼褐鸥。 笑死线脚,一個胖子當(dāng)著我的面吹牛,可吹牛的內(nèi)容都是我干的叫榕。 我是一名探鬼主播浑侥,決...
    沈念sama閱讀 40,251評論 3 418
  • 文/蒼蘭香墨 我猛地睜開眼,長吁一口氣:“原來是場噩夢啊……” “哼晰绎!你這毒婦竟也來了寓落?” 一聲冷哼從身側(cè)響起,我...
    開封第一講書人閱讀 39,129評論 0 276
  • 序言:老撾萬榮一對情侶失蹤荞下,失蹤者是張志新(化名)和其女友劉穎伶选,沒想到半個月后,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體尖昏,經(jīng)...
    沈念sama閱讀 45,561評論 1 314
  • 正文 獨居荒郊野嶺守林人離奇死亡仰税,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點故事閱讀 37,779評論 3 335
  • 正文 我和宋清朗相戀三年,在試婚紗的時候發(fā)現(xiàn)自己被綠了抽诉。 大學(xué)時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片陨簇。...
    茶點故事閱讀 39,902評論 1 348
  • 序言:一個原本活蹦亂跳的男人離奇死亡,死狀恐怖迹淌,靈堂內(nèi)的尸體忽然破棺而出河绽,到底是詐尸還是另有隱情己单,我是刑警寧澤,帶...
    沈念sama閱讀 35,621評論 5 345
  • 正文 年R本政府宣布耙饰,位于F島的核電站纹笼,受9級特大地震影響,放射性物質(zhì)發(fā)生泄漏苟跪。R本人自食惡果不足惜允乐,卻給世界環(huán)境...
    茶點故事閱讀 41,220評論 3 328
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望削咆。 院中可真熱鬧,春花似錦蠢笋、人聲如沸拨齐。這莊子的主人今日做“春日...
    開封第一講書人閱讀 31,838評論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽瞻惋。三九已至,卻和暖如春援岩,著一層夾襖步出監(jiān)牢的瞬間歼狼,已是汗流浹背。 一陣腳步聲響...
    開封第一講書人閱讀 32,971評論 1 269
  • 我被黑心中介騙來泰國打工享怀, 沒想到剛下飛機(jī)就差點兒被人妖公主榨干…… 1. 我叫王不留羽峰,地道東北人。 一個月前我還...
    沈念sama閱讀 48,025評論 2 370
  • 正文 我出身青樓添瓷,卻偏偏與公主長得像梅屉,于是被迫代替她去往敵國和親。 傳聞我的和親對象是個殘疾皇子鳞贷,可洞房花燭夜當(dāng)晚...
    茶點故事閱讀 44,843評論 2 354