最新国产好看的视频,伊人天堂AV在线,国产Aaaaaa视频,蜜臀视频在线观看一区,人妻av色图,密臀久久久精品影片,青青视频免费观看毛片,久草在线观看视,国产三级精品色情在线

進(jìn)一步理解Java中的多態(tài)概念

 更新時(shí)間:2015年08月06日 16:23:52   作者:zinss26914  
這篇文章主要介紹了進(jìn)一步理解Java中的多態(tài)概念,是Java入門(mén)學(xué)習(xí)中的基礎(chǔ)知識(shí),需要的朋友可以參考下

多態(tài)性有兩種:
1)編譯時(shí)多態(tài)性
對(duì)于多個(gè)同名方法,如果在編譯時(shí)能夠確定執(zhí)行同名方法中的哪一個(gè),則稱為編譯時(shí)多態(tài)性.
2)運(yùn)行時(shí)多態(tài)性
如果在編譯時(shí)不能確定,只能在運(yùn)行時(shí)才能確定執(zhí)行多個(gè)同名方法中的哪一個(gè),則稱為運(yùn)行時(shí)多態(tài)性.

方法覆蓋表現(xiàn)出兩種多態(tài)性,當(dāng)對(duì)象獲得本類實(shí)例時(shí),為編譯時(shí)多態(tài)性,否則為運(yùn)行時(shí)多態(tài)性,例如:
XXXX x1 = new XXXX(參數(shù)列表); //對(duì)象獲得本類實(shí)例,對(duì)象與其引用的實(shí)例類型一致
XXX xx1 = new XXX(參數(shù)列表);
x1.toString(); //編譯時(shí)多態(tài)性,執(zhí)行XXX類的方法.
xx1.toString(); //編譯時(shí)多態(tài)性,執(zhí)行XXXX類覆蓋的方法.
XXXX為XXX的父類.
由于子類對(duì)象既是父類對(duì)象,父類對(duì)象與子類對(duì)象之間具有賦值相容性,父類對(duì)象能夠被賦值為子類對(duì)象.例如,
XXXX x2 = new XXX(參數(shù)列表); //父類對(duì)象獲得子類實(shí)例,子類對(duì)象即是父類對(duì)象
x2.toString(); //運(yùn)行時(shí)多態(tài)
 
x2聲明為父類對(duì)象卻獲得子類XXX的實(shí)例,那么x2.toString()究竟執(zhí)行父類方法還是執(zhí)行子類覆蓋的方法呢?
這分為兩種情況:
取決于子類是否覆蓋父類方法.如果子類覆蓋父類方法,則執(zhí)行子類方法;
如果沒(méi)有覆蓋,則執(zhí)行父類方法.
在編譯時(shí),僅僅依據(jù)對(duì)象所屬的類,系統(tǒng)無(wú)法確定到底應(yīng)該執(zhí)行那個(gè)類的方法,只有運(yùn)行時(shí)才能確定,因此這是運(yùn)行時(shí)多態(tài).
父類對(duì)象并不能執(zhí)行所有的子類方法,只能執(zhí)行那些父類中聲明\子類覆蓋的子類方法.

java多態(tài)實(shí)現(xiàn)
java的多態(tài)和c++一樣,是通過(guò)動(dòng)態(tài)綁定或者說(shuō)運(yùn)行時(shí)綁定來(lái)實(shí)現(xiàn)的。當(dāng)調(diào)用某一個(gè)對(duì)象引用的方法時(shí),因?yàn)榫幾g器并不知道這個(gè)引用到底指向的是變量聲明時(shí)說(shuō)明的類型對(duì)象,還是該類型子類的對(duì)象。因此編譯器無(wú)法為這次調(diào)用綁定到具體的某個(gè)方法。只有通過(guò)java中運(yùn)行時(shí)類型識(shí)別(RTT)在運(yùn)行時(shí)綁定到具體的方法

方法的重寫(xiě)overriding和方法的重載overloading是java多態(tài)的不同表現(xiàn)。重寫(xiě)overriding是父類和子類之間多態(tài)性的一種表現(xiàn),重載overloading是一個(gè)類中多態(tài)性的表現(xiàn)。

給出一個(gè)具體例子:

  

 class People { 
  public String toString() { 
   return "I am a people!"; 
  } 
  
  public void eat() { 
  }; 
  
  public void speak() { 
  }; 
 } 
  
 class Boy extends People { 
  public String toString() { 
   return "I am a boy!"; 
  } 
  
  public void fight() { 
  }; 
  
  public void speak() { 
  }; 
 } 
  
 class Girl extends People { 
  public String toString() { 
   return "I am a girl!"; 
  } 
  
  public void sing() { 
  }; 
  
  public void speak() { 
  }; 
 } 
  
 public class TestToString { 
  public static void main(String args[]) { 
   People p = new Girl(); 
   System.out.println(p.toString()); 
  } 
 } 

運(yùn)行結(jié)果是:

I am a girl!

p是People的一個(gè)引用,但是在運(yùn)行時(shí)因?yàn)槭荊irl對(duì)象,所以還是調(diào)用了Girl的toString方法


深入理解java多態(tài)
聲明,這里借鑒了其他同學(xué)的例子,原文鏈接:http://blog.csdn.net/thinkghoster/article/details/2307001

測(cè)試題目

 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 { 
   
 } 
  
 public class Main { 
  public static void main(String args[]) { 
   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)); // 1 
   System.out.println(a1.show(c)); // 2 
   System.out.println(a1.show(d)); // 3 
   System.out.println(a2.show(b)); // 4 
   System.out.println(a2.show(c)); // 5 
   System.out.println(a2.show(d)); // 6 
   System.out.println(b.show(b)); // 7 
   System.out.println(b.show(c)); // 8 
   System.out.println(b.show(d)); // 9 
  } 
 } 

答案

 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 

解析
我開(kāi)始做這道題目,4、5、6、9全部做錯(cuò)了,原因就是沒(méi)能很好的理解java的多態(tài)性,這里說(shuō)明一下

首先,要深刻的理解重寫(xiě)和重載,重寫(xiě)不僅僅包括了函數(shù)名稱相同,也包括參數(shù)類型和返回值類型

其次,深刻理解這句話“當(dāng)超類對(duì)象引用變量引用子類對(duì)象時(shí),被引用對(duì)象的類型而不是引用變量的類型決定了調(diào)用誰(shuí)的成員方法,但是這個(gè)被調(diào)用的方法必須是在超類中定義過(guò)的,也就是說(shuō)被子類重寫(xiě)的方法”

然后,我們?cè)趤?lái)分析一下這幾道題目

問(wèn)題:你認(rèn)為B重寫(xiě)了父類A的show方法了嗎?如果重寫(xiě)了,重寫(xiě)了幾個(gè)?

答案:重寫(xiě)了,重寫(xiě)了一個(gè),也就是public String show(A obj),為什么public String show(B obj)不算重寫(xiě)父類方法呢,很簡(jiǎn)單,因?yàn)閰?shù)類型不同

舉例分析
看了上面的分析,我們也來(lái)分析兩個(gè)例子:

一、a2.show(b):

a2是一個(gè)引用變量,類型為A,b是B的一個(gè)實(shí)例。首先,在類A中找show(B obj),沒(méi)有找到。于是到A的超類中找,而A沒(méi)有超類,因此轉(zhuǎn)向了A.this((super)B),(super)B為A,因此在A中找到了show(A obj)的方法,但是由于a2引用的類B的一個(gè)對(duì)象,B重寫(xiě)了A的show(A obj)方法,因此最終鎖定到類B的show(A obj),輸出為“B and A”

二、a2.show(c):
a2是一個(gè)引用變量,類型為A,b是B的一個(gè)實(shí)例。首先,在類A中找show(C obj),沒(méi)有找到。于是到A的超類中找,而A沒(méi)有超類,因此轉(zhuǎn)向了A.this((super)C),(super)C為B,到這里為止,這個(gè)a2.show(c)變成了a2.show(b)的問(wèn)題,而a2.show(b)上面已經(jīng)分析了是輸出"B and A",因此這里也是輸出“B and A”


相關(guān)文章

  • spring整合cxf框架實(shí)例

    spring整合cxf框架實(shí)例

    下面小編就為大家?guī)?lái)一篇spring整合cxf框架實(shí)例。小編覺(jué)得挺不錯(cuò)的。現(xiàn)在就分享給大家,也給大家做個(gè)參考。一起跟隨小編過(guò)來(lái)看看吧
    2017-06-06
  • Swagger屏蔽某些接口顯示的操作

    Swagger屏蔽某些接口顯示的操作

    這篇文章主要介紹了Swagger屏蔽某些接口顯示的操作,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。如有錯(cuò)誤或未考慮完全的地方,望不吝賜教
    2021-06-06
  • 詳解spring cloud hystrix 請(qǐng)求合并collapsing

    詳解spring cloud hystrix 請(qǐng)求合并collapsing

    這篇文章主要介紹了詳解spring cloud hystrix 請(qǐng)求合并collapsing,小編覺(jué)得挺不錯(cuò)的,現(xiàn)在分享給大家,也給大家做個(gè)參考。一起跟隨小編過(guò)來(lái)看看吧
    2018-05-05
  • JavaWeb購(gòu)物車項(xiàng)目開(kāi)發(fā)實(shí)戰(zhàn)指南

    JavaWeb購(gòu)物車項(xiàng)目開(kāi)發(fā)實(shí)戰(zhàn)指南

    之前沒(méi)有接觸過(guò)購(gòu)物車的東東,也不知道購(gòu)物車應(yīng)該怎么做,所以在查詢了很多資料,總結(jié)一下購(gòu)物車的功能實(shí)現(xiàn),下面這篇文章主要給大家介紹了關(guān)于JavaWeb購(gòu)物車項(xiàng)目開(kāi)發(fā)的相關(guān)資料,需要的朋友可以參考下
    2022-06-06
  • Java之HashMap.values()轉(zhuǎn)List時(shí)的錯(cuò)誤和正確演示

    Java之HashMap.values()轉(zhuǎn)List時(shí)的錯(cuò)誤和正確演示

    這篇文章主要介紹了Java之HashMap.values()轉(zhuǎn)List時(shí)的錯(cuò)誤和正確演示,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。如有錯(cuò)誤或未考慮完全的地方,望不吝賜教
    2023-03-03
  • java 逐行讀取txt文本如何解決中文亂碼

    java 逐行讀取txt文本如何解決中文亂碼

    在使用java讀取txt文本中如含有中文,可能會(huì)出現(xiàn)亂碼,很多初學(xué)者束手無(wú)策,本文將提供詳細(xì)的解決方法
    2012-11-11
  • Springboot中LocalDateTime對(duì)象返回給前端格式化解決方案

    Springboot中LocalDateTime對(duì)象返回給前端格式化解決方案

    在項(xiàng)目開(kāi)發(fā)當(dāng)中前后端使用什么樣的時(shí)間格式,是一個(gè)值得關(guān)注的問(wèn)題,這篇文章主要給大家介紹了關(guān)于Springboot中LocalDateTime對(duì)象返回給前端格式化的解決方案,文中通過(guò)代碼介紹的非常詳細(xì),需要的朋友可以參考下
    2024-04-04
  • 基于javaWeb 項(xiàng)目SSM配置要點(diǎn)及可能遇到的問(wèn)題和解決方法

    基于javaWeb 項(xiàng)目SSM配置要點(diǎn)及可能遇到的問(wèn)題和解決方法

    下面小編就為大家?guī)?lái)一篇基于javaWeb 項(xiàng)目SSM配置要點(diǎn)及可能遇到的問(wèn)題和解決方法。小編覺(jué)得挺不錯(cuò)的,現(xiàn)在就分享給大家,也給大家做個(gè)參考。一起跟隨小編過(guò)來(lái)看看吧
    2017-10-10
  • java封裝的概念和實(shí)現(xiàn)方法示例

    java封裝的概念和實(shí)現(xiàn)方法示例

    這篇文章主要介紹了java封裝的概念和實(shí)現(xiàn)方法,結(jié)合實(shí)例形式詳細(xì)分析了java封裝的概念、原理及相關(guān)使用技巧,需要的朋友可以參考下
    2019-11-11
  • 詳解java 中泛型中的類型擦除和橋方法

    詳解java 中泛型中的類型擦除和橋方法

    這篇文章主要介紹了詳解java 中泛型中的類型擦除和橋方法的相關(guān)資料,需要的朋友可以參考下
    2017-06-06

最新評(píng)論

航空| 普安县| 咸宁市| 山丹县| 长海县| 仁寿县| 吴忠市| 芜湖市| 太仆寺旗| 上饶市| 天全县| 金华市| 海门市| 崇礼县| 洛南县| 临武县| 濉溪县| 鸡西市| 靖边县| 民县| 沾益县| 德安县| 陇南市| 滕州市| 那曲县| 老河口市| 金寨县| 和田市| 慈溪市| 珠海市| 宁河县| 清水河县| 苍溪县| 探索| 浮山县| 威远县| 台北县| 南和县| 营口市| 饶阳县| 怀来县|