亚洲乱码中文字幕综合,中国熟女仑乱hd,亚洲精品乱拍国产一区二区三区,一本大道卡一卡二卡三乱码全集资源,又粗又黄又硬又爽的免费视频

java中多態(tài)概念、實現(xiàn)原理詳解

 更新時間:2017年04月12日 17:08:06   作者:471912619  
JAVA中多態(tài)性是對象多種表現(xiàn)形式的體現(xiàn)。在面向?qū)ο笾?最常見的多態(tài)發(fā)生在使用父類的引用來引用子類的對象。下面這篇文章主要給大家介紹一下,需要的朋友可以參考下

一.什么是多態(tài)?

1.多態(tài)的定義

指允許不同類的對象對同一消息做出響應(yīng)。即同一消息可以根據(jù)發(fā)送對象的不同而采用多種不同的行為方式(發(fā)送消息就是函數(shù)調(diào)用)

2.多態(tài)的作用

消除類型之間的耦合關(guān)系

3.多態(tài)的說明

近代網(wǎng)絡(luò)小說泛濫,我們可以用它來舉一個例子

某日看見你手機上有多部小說同時更新了,比如有大主宰,雪鷹領(lǐng)主,龍王傳說…在這里我們可以描述成如下:

小說a=大主宰

小說b=雪鷹領(lǐng)主

小說c=龍王傳說

這里所表現(xiàn)的就是多態(tài),大主宰,雪鷹領(lǐng)主,龍王傳說都是小說的子類,我們僅僅可以通過小說這個父類就能夠引用不同的子類,這就是多態(tài)–我們只有在運行的時候才會知道引用變量所指向的具體實例對象

當(dāng)然,這樣的理解是是遠遠不夠的,要對多態(tài)的理解入門就必須要明白是”向上轉(zhuǎn)型”

 在上面的例子中,小說(XS)是父類,大主宰(DZZ),雪鷹領(lǐng)主(XYLZ),龍王傳說(LWCS)都是其子類 于是,我們定義如下代碼

DZZ a=new DZZ();

對于這段代碼應(yīng)該都不會感覺到陌生,無非就是實例化了一個大主宰的對象 那么對于如下的這段代碼呢?

XS a=new DZZ();

在這里我們這樣理解,這里定義了一個XS類型的a,讓它指向了DZZ對象實例。由于DZZ是繼承于XS,所以DZZ可以自動向上轉(zhuǎn)型為XS,所以a可以指向DZZ實例對象的。這樣做存在一個非常大的好處,在繼承中我們知道子類是父類的擴展,它可以提供比父類更加強大的功能,如果我們定義了一個指向子類的父類引用類型,那么它除了能夠引用父類的共性外,還可以使用子類強大的功能

但是向上轉(zhuǎn)型也存在一些缺憾,那就是它必定會導(dǎo)致一些方法和屬性的丟失,而導(dǎo)致我們不能夠獲取它們。所以父類類型的運用可以調(diào)用父類中定義的所有屬性和方法,對于只存在與子類中的方法和屬性它就望塵莫及了

public class XS {

    public void fun1() {
      System.out.println("XS中的fun1");
      fun2();
    }


  public void fun2() {
     System.out.println("XS中的fun2");    
  }
}

public class DZZ extends XS{

  /*
   * 子類重載父類方法
   * 父類中不存在該方法,向上轉(zhuǎn)型后,父類是不能引用該方法的
   */
   public void fun1(String a) {
     System.out.println("DZZ中的fun1");
     fun2();
   }

   /*
    * 子類重寫父類方法 
    * 調(diào)用必定使用這個方法
    */
   public void fun2() {
     System.out.println("DZZ中的fun2");
   }
}

public class DuoTaiTest {

   public static void main(String[] args) {
     XS a=new DZZ();
     a.fun1();
  }
}
output:
XS中的fun1
DZZ中的fun2

所以對于多態(tài)我們可以總結(jié)如下:
指向子類的父類引用由于向上轉(zhuǎn)型了,它只能訪問父類中擁有的方法和屬性,而對于子類中存在而父類中不存在的方法,該引用是不能使用的,盡管是重載該方法。若子類重寫了父類中的某些方法,在調(diào)用該些方法的時候,必定是使用子類中定義的這些方法(動態(tài)連接,動態(tài)調(diào)用)

對于面向?qū)ο?多態(tài)分為編譯時多態(tài)和運行時多態(tài),其中編輯時多態(tài)是靜態(tài)的,主要是指方法的重載,它是根據(jù)參數(shù)列表的不同來區(qū)分不同的函數(shù),通過編輯之后會變成兩個不同的函數(shù),在運行時談不上多態(tài)。而運行時多態(tài)是動態(tài)的,它是通過動態(tài)綁定來實現(xiàn)的,也就是我們所說的多態(tài)性。

二.多態(tài)的實現(xiàn)

1.實現(xiàn)條件

在剛剛開始就剃刀了繼承在為多態(tài)的實現(xiàn)做了準備。子類Child繼承父類Father,我們可以編寫一個指向子類的父類類型引用,該引用既可以處理父類Father對象,也可以處理子類Child對象,當(dāng)相同的消息發(fā)送給子類或者父類對象時,該對象就會根據(jù)自己所屬的引用而執(zhí)行不同的行為,這就是多態(tài)。即多態(tài)性就是相同的消息使得不同的類做出不同的響應(yīng)

Java實現(xiàn)多態(tài)有三個必要條件:繼承,重寫,向上轉(zhuǎn)型

繼承:在多態(tài)中必須存在有繼承關(guān)系的子類和父類

重寫:子類對父類中某些方法進行重新定義,在調(diào)用這些方法時就會調(diào)用子類的方法

向上轉(zhuǎn)型:在多態(tài)中需要將子類的引用賦給父類對象,只有這樣該引用才能夠具備技能調(diào)用父類的方法和子類的方法

只有滿足了上述三個條件,我們才能夠在同一個繼承結(jié)構(gòu)中使用同一的邏輯實現(xiàn)代碼處理不同的對象,從而達到執(zhí)行不同的行為

 對于Java而言,它多態(tài)的實現(xiàn)機制遵循一個原則:當(dāng)超類對象引用變量引用子類對象時,被引用對象的類型而不是引用變量的類型決定了調(diào)用誰的成員方法,但是這個被調(diào)用的方法必須是在超類中定義過的,也就是說被子類覆蓋的方法

2.實現(xiàn)形式

繼承

public class XS {

      private String name;

    public String getName() {
      return name;
    }

    public void setName(String name) {
      this.name = name;
    }

    public XS() {

    }

    public String drink() {
      return "你看的小說名字:"+getName();
    }

    public String toString() {
       return null;
    }


}
public class DZZ extends XS{


  public DZZ() {
    setName("DZZ");
  }

  public String drink() {
    return "你看的小說名字:"+getName();
  }

  public String toString() {

    return "小說名:"+getName();
  }
}
public class XYLZ extends XS{

  /**
   * 
   */
  public XYLZ() {
     setName("XYLZ");
  }

  public String drink() {
    return "你看的小說名字:"+getName();
  }

  public String toString() {

    return "小說名:"+getName();
  }
}   
public class DuoTaiTest {
    public static void main(String[] args) {
      XS [] xs=new XS[2];

      DZZ a=new DZZ();
      XYLZ b=new XYLZ();

      xs[0]=a;
      xs[1]=b;

      for(int i=0;i<2;i++) {
       System.out.println(xs[i].toString()+"::::"+xs[i].drink());
      }

      System.out.println("-------------------");
  }
}
ouput:
小說名:DZZ::::你看的小說名字:DZZ
小說名:XYLZ::::你看的小說名字:XYLZ
-------------------

在上面的代碼中DZZ,XYLZ繼承XS 并且重寫了drink(),toString()方法,程序運行結(jié)果是調(diào)用子類中方法,輸出DZZ,XYLZ的名稱,這就是多態(tài)的表現(xiàn)。不同的對象可以執(zhí)行相同的行為,但是他們都需要通過自己的實現(xiàn)方式來執(zhí)行,這就要得益于向上轉(zhuǎn)型了

我們都知道所有的類都繼承自超類Object,toString()方法也是Object中方法,當(dāng)我們這樣寫時:

Object o = new DZZ();
System.out.println(o.toString());

output:
小說名:DZZ

Object,XS,DZZ三者繼承鏈關(guān)系是:DZZ—>XS—>Object。所以我們可以這樣說:當(dāng)子類重寫父類的方法被調(diào)用時,只有對象繼承鏈中的最末端的方法才會被調(diào)用。但是注意如果這樣寫:

Object o = new xs();

System.out.println(o.toString());

output:
null//因為DZZ并不存在于該對象繼承鏈中

所以基于繼承實現(xiàn)的多態(tài)可以總結(jié)如下:對于引用子類的父類類型,在處理該引用時,它適用于繼承該父類的所有子類,子類對象的不同,對方法的實現(xiàn)也就不同,執(zhí)行相同動作產(chǎn)生的行為也就不同。

如果父類是抽象類,那么子類必須要實現(xiàn)父類中所有的抽象方法,這樣該父類所有的子類一定存在統(tǒng)一的對外接口,但其內(nèi)部的具體實現(xiàn)可以各異。這樣我們就可以使用頂層類提供的統(tǒng)一接口來處理該層次的方法。

本篇文章的內(nèi)容希望能給需要的朋友一些幫助

相關(guān)文章

  • windows下使用 intellij idea 編譯 kafka 源碼環(huán)境

    windows下使用 intellij idea 編譯 kafka 源碼環(huán)境

    這篇文章主要介紹了使用 intellij idea 編譯 kafka 源碼的環(huán)境,本文是基于windows下做的項目演示,需要的朋友可以參考下
    2021-10-10
  • 通過Java代碼來創(chuàng)建view的方法

    通過Java代碼來創(chuàng)建view的方法

    本文給大家分享通過java代碼創(chuàng)建view的方法,以TextView為例創(chuàng)建控件的方法,需要的的朋友參考下吧
    2017-08-08
  • Mybatis查找返回Map,List集合類型的數(shù)據(jù)方式

    Mybatis查找返回Map,List集合類型的數(shù)據(jù)方式

    這篇文章主要介紹了Mybatis查找返回Map,List集合類型的數(shù)據(jù)方式,具有很好的參考價值,希望對大家有所幫助。如有錯誤或未考慮完全的地方,望不吝賜教
    2021-07-07
  • springboot如何獲取文件流

    springboot如何獲取文件流

    這篇文章主要介紹了springboot如何獲取文件流,具有很好的參考價值,希望對大家有所幫助。如有錯誤或未考慮完全的地方,望不吝賜教
    2022-03-03
  • Java與Scala創(chuàng)建List與Map的實現(xiàn)方式

    Java與Scala創(chuàng)建List與Map的實現(xiàn)方式

    這篇文章主要介紹了Java與Scala創(chuàng)建List與Map的實現(xiàn)方式,具有很好的參考價值,希望對大家有所幫助。如有錯誤或未考慮完全的地方,望不吝賜教
    2021-10-10
  • Java設(shè)計模式中的抽象工廠模式解讀

    Java設(shè)計模式中的抽象工廠模式解讀

    這篇文章主要介紹了Java設(shè)計模式中的抽象工廠模式解讀,抽象工廠模式為創(chuàng)建一組相關(guān)或相互依賴的對象提供一個接口,而且無需指定他們的具體類,需要的朋友可以參考下
    2023-11-11
  • 使用SpringBoot進行身份驗證和授權(quán)的示例詳解

    使用SpringBoot進行身份驗證和授權(quán)的示例詳解

    在廣闊的 Web 開發(fā)世界中,身份驗證是每個數(shù)字領(lǐng)域的守護者,在本教程中,我們將了解如何以本機方式保護、驗證和授權(quán) Spring-Boot 應(yīng)用程序的用戶,并遵循框架的良好實踐,希望對大家有所幫助
    2023-11-11
  • Eclipse開發(fā)JavaWeb項目配置Tomcat的方法步驟

    Eclipse開發(fā)JavaWeb項目配置Tomcat的方法步驟

    本文主要介紹了Eclipse開發(fā)JavaWeb項目配置Tomcat的方法步驟,首先介紹eclipse開發(fā)JavaWeb項目需要配置的相關(guān)環(huán)境,使用tomcat軟件在本地搭建服務(wù)器,然后再在eclipse環(huán)境下配置tomcat,感興趣的可以了解一下
    2021-08-08
  • SpringCloud集成Micrometer Tracing的代碼工程

    SpringCloud集成Micrometer Tracing的代碼工程

    Micrometer Tracing 是一個用于微服務(wù)架構(gòu)的追蹤庫,它提供了一種簡單而強大的方式來收集和報告分布式系統(tǒng)中的性能和調(diào)用鏈信息,Micrometer Tracing 旨在幫助開發(fā)者和運維人員理解微服務(wù)之間的交互,本文給大家介紹了如何在 Spring Cloud 集成 Micrometer Tracing
    2024-12-12
  • 淺談java安全編碼指南之堆污染

    淺談java安全編碼指南之堆污染

    什么是堆污染呢?是指當(dāng)參數(shù)化類型變量引用的對象不是該參數(shù)化類型的對象時而發(fā)生的。我們知道在JDK5中,引入了泛型的概念,在創(chuàng)建集合類的時候,指定該集合類中應(yīng)該存儲的對象類型。如果在指定類型的集合中,引用了不同的類型,那么這種情況就叫做堆污染。
    2021-06-06

最新評論