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

Java多態(tài)和實(shí)現(xiàn)接口的類的對(duì)象賦值給接口引用的方法(推薦)

 更新時(shí)間:2017年02月21日 09:46:02   投稿:jingxian  
下面小編就為大家?guī)?lái)一篇Java多態(tài)和實(shí)現(xiàn)接口的類的對(duì)象賦值給接口引用的方法(推薦)。小編覺(jué)得挺不錯(cuò)的,現(xiàn)在就分享給大家,也給大家做個(gè)參考。一起跟隨小編過(guò)來(lái)看看吧

接口的靈活性就在于“規(guī)定一個(gè)類必須做什么,而不管你如何做”。

我們可以定義一個(gè)接口類型的引用變量來(lái)引用實(shí)現(xiàn)接口的類的實(shí)例,當(dāng)這個(gè)引用調(diào)用方法時(shí),它會(huì)根據(jù)實(shí)際引用的類的實(shí)例來(lái)判斷具體調(diào)用哪個(gè)方法,這和上述的超類對(duì)象引用訪問(wèn)子類對(duì)象的機(jī)制相似。

//定義接口InterA
interface InterA
{
 void fun();
}
//實(shí)現(xiàn)接口InterA的類B
class B implements InterA
{
 public void fun()
 {
  System.out.println(“This is B”);
 }
}

//實(shí)現(xiàn)接口InterA的類C
class C implements InterA
{
 public void fun()
 {
  System.out.println(“This is C”);
 }
}

class Test
{
 public static void main(String[] args)
 {
  InterA a;
  a= new B();
  a.fun();
  a = new C();
  a.fun();
 }
}

輸出結(jié)果為:

This is B
This is C

上例中類B和類C是實(shí)現(xiàn)接口InterA的兩個(gè)類,分別實(shí)現(xiàn)了接口的方法fun(),通過(guò)將類B和類C的實(shí)例賦給接口引用a,實(shí)現(xiàn)了方法在運(yùn)行時(shí)的動(dòng)態(tài)綁定,充分利用了“一個(gè)接口,多個(gè)方法”,展示了Java的動(dòng)態(tài)多態(tài)性。

需要注意的一點(diǎn)是:Java在利用接口變量調(diào)用其實(shí)現(xiàn)類的對(duì)象的方法時(shí),該方法必須已經(jīng)在接口中被聲明,而且在接口的實(shí)現(xiàn)類中該實(shí)現(xiàn)方法的類型和參數(shù)必須與接口中所定義的精確匹配。

--------------------------------------------------------------------------------

擴(kuò)展

Java運(yùn)行時(shí)多態(tài)性:繼承和接口的實(shí)現(xiàn)

Java是面向?qū)ο蟮恼Z(yǔ)言,而運(yùn)行時(shí)多態(tài)性是面向?qū)ο蟪绦蛟O(shè)計(jì)代碼重用的一個(gè)最強(qiáng)大機(jī)制,動(dòng)態(tài)性的概念也可以被說(shuō)成“一個(gè)接口,多個(gè)方法”。Java實(shí)現(xiàn)運(yùn)行時(shí)多態(tài)性的基礎(chǔ)是動(dòng)態(tài)方法調(diào)度,它是一種在運(yùn)行時(shí)而不是在編譯期調(diào)用重載方法的機(jī)制,下面就繼承和接口實(shí)現(xiàn)兩方面談?wù)刯ava運(yùn)行時(shí)多態(tài)性的實(shí)現(xiàn)。

一、通過(guò)繼承中超類對(duì)象引用變量引用子類對(duì)象來(lái)實(shí)現(xiàn)

舉例說(shuō)明:

//定義超類superA 
class superA {
  int i = 100;

  void fun() {
    System.out.println(“This is superA”);
  }
}

//定義superA的子類subB 
class subB extends superA {
  int m = 1;

  void fun() {
    System.out.println(“This is subB”);
  }
}

//定義superA的子類subC 
class subC extends superA {
  int n = 1;

  void fun() {
    System.out.println(“This is subC”);
  }
}

class Test {
  public static void main(String[] args) {
    superA a;
    subB b = new subB();
    subC c = new subC();
    a = b;
    a.fun();
    (1)
    a = c;
    a.fun();
    (2)
  }
}  

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

This is subB

This is subC

上述代碼中subB和subC是超類superA的子類,我們?cè)陬怲est中聲明了3個(gè)引用變量a, b, c,通過(guò)將子類對(duì)象引用賦值給超類對(duì)象引用變量來(lái)實(shí)現(xiàn)動(dòng)態(tài)方法調(diào)用。也許有人會(huì)問(wèn):“為什么(1)和(2)不輸出:This is superA”。java 的這種機(jī)制遵循一個(gè)原則:當(dāng)超類對(duì)象引用變量引用子類對(duì)象時(shí),被引用對(duì)象的類型而不是引用變量的類型決定了調(diào)用誰(shuí)的成員方法,但是這個(gè)被調(diào)用的方法必須是在超類中定義過(guò)的,也就是說(shuō)被子類覆蓋的方法。

所以,不要被上例中(1)和(2)所迷惑,雖然寫(xiě)成a.fun(),但是由于(1)中的a被b賦值,指向了子類subB的一個(gè)實(shí)例,因而(1)所調(diào)用的fun()實(shí)際上是子類subB的成員方法fun(),它覆蓋了超類superA的成員方法fun();同樣(2)調(diào)用的是子類subC的成員方法fun()。

另外,如果子類繼承的超類是一個(gè)抽象類,雖然抽象類不能通過(guò)new操作符實(shí)例化,但是可以創(chuàng)建抽象類的對(duì)象引用指向子類對(duì)象,以實(shí)現(xiàn)運(yùn)行時(shí)多態(tài)性。具體的實(shí)現(xiàn)方法同上例。

不過(guò),抽象類的子類必須覆蓋實(shí)現(xiàn)超類中的所有的抽象方法,否則子類必須被abstract修飾符修飾,當(dāng)然也就不能被實(shí)例化了。

二、通過(guò)接口類型變量引用實(shí)現(xiàn)接口的類的對(duì)象來(lái)實(shí)現(xiàn)

接口的靈活性就在于“規(guī)定一個(gè)類必須做什么,而不管你如何做”。我們可以定義一個(gè)接口類型的引用變量來(lái)引用實(shí)現(xiàn)接口的類的實(shí)例,當(dāng)這個(gè)引用調(diào)用方法時(shí),它會(huì)根據(jù)實(shí)際引用的類的實(shí)例來(lái)判斷具體調(diào)用哪個(gè)方法,這和上述的超類對(duì)象引用訪問(wèn)子類對(duì)象的機(jī)制相似。

舉例說(shuō)明:

//定義接口InterA 
interface InterA
{
  void fun();
}
//實(shí)現(xiàn)接口InterA的類B 
class B implements InterA
{
  public void fun()
  {
    System.out.println(“This is B”);
  }
}
//實(shí)現(xiàn)接口InterA的類C 
class C implements InterA
{
  public void fun()
  {
    System.out.println(“This is C”);
  }
}
class Test
{
  public static void main(String[] args)
  {
    InterA a;
    a= new B();
    a.fun();
    a = new C();
    a.fun();
  }
} 

輸出結(jié)果為:

This is B

This is C

上例中類B和類C是實(shí)現(xiàn)接口InterA的兩個(gè)類,分別實(shí)現(xiàn)了接口的方法fun(),通過(guò)將類B和類C的實(shí)例賦給接口引用a而實(shí)現(xiàn)了方法在運(yùn)行時(shí)的動(dòng)態(tài)綁定,充分利用了“一個(gè)接口,多個(gè)方法”展示了Java的動(dòng)態(tài)多態(tài)性。

需要注意的一點(diǎn)是:Java在利用接口變量調(diào)用其實(shí)現(xiàn)類的對(duì)象的方法時(shí),該方法必須已經(jīng)在接口中被聲明,而且在接口的實(shí)現(xiàn)類中該實(shí)現(xiàn)方法的類型和參數(shù)必須與接口中所定義的精確匹配。

結(jié)束語(yǔ):以上就是java運(yùn)行時(shí)多態(tài)性的實(shí)現(xiàn)方法,大家在編程過(guò)程中可以靈活運(yùn)用,但是在性能要求較高的代碼中不提倡運(yùn)用運(yùn)行時(shí)多態(tài),畢竟Java的運(yùn)行時(shí)動(dòng)態(tài)方法調(diào)用較之普通的方法調(diào)用的系統(tǒng)開(kāi)銷是比較大的。

--------------------------------------------------

Java靜態(tài)方法不具有多態(tài)性詳解

動(dòng)態(tài)綁定機(jī)制使得基類的引用能夠指向正確的子類對(duì)象,從而使得面向基類編程成為可能。

然而動(dòng)態(tài)綁定在以下兩種情況會(huì)失效。

1、基類方法是private或final修飾的

這個(gè)很好理解,因?yàn)閜rivate說(shuō)明該方法對(duì)子類是不可見(jiàn)的,子類再寫(xiě)一個(gè)同名的方法并不是對(duì)父類方法進(jìn)行復(fù)寫(xiě)(Override),而是重新生成一個(gè)新的方法,也就不存在多態(tài)的問(wèn)題了。同理也可以解釋final,因?yàn)榉椒ㄍ瑯邮遣豢筛采w的。

2、方法是static修飾的

代碼如下所示.

class Base {
 public static void staticMethod() {
  System.out.println("Base staticMehtod");
 }

 public void dynamicMehtod() {
  System.out.println("Base dynamicMehtod");
 }
}

class Sub extends Base {
 public static void staticMethod() {
  System.out.println("Sub staticMehtod");
 }

 public void dynamicMehtod() {
  System.out.println("Sub dynamicMehtod");
 }
}

public class TJ4 {
 public static void main(String args[]) {
  Base c = new Sub();
  c.staticMethod();
  c.dynamicMehtod();
 }
}

輸出結(jié)果如下:

 Base staticMehtod
 Sub dynamicMehtod

輸出結(jié)果并不像設(shè)想的那樣,輸出 “Sub staticMehtod”。因?yàn)殪o態(tài)方法是與類而不是與某個(gè)對(duì)象相關(guān)聯(lián),c.staticMethod();等同于Car.staticMethod(); 所以盡量不要使用實(shí)例變量去調(diào)用靜態(tài)方法,避免混淆。

以上這篇Java多態(tài)和實(shí)現(xiàn)接口的類的對(duì)象賦值給接口引用的方法(推薦)就是小編分享給大家的全部?jī)?nèi)容了,希望能給大家一個(gè)參考,也希望大家多多支持腳本之家。

相關(guān)文章

  • kafka生產(chǎn)者發(fā)送消息流程深入分析講解

    kafka生產(chǎn)者發(fā)送消息流程深入分析講解

    本文將介紹kafka的一條消息的發(fā)送流程,從消息的發(fā)送到服務(wù)端的存儲(chǔ)。上文說(shuō)到kafak分為客戶端與服務(wù)端,要發(fā)送消息就涉及到了網(wǎng)絡(luò)通訊,kafka采用TCP協(xié)議進(jìn)行客戶端與服務(wù)端的通訊協(xié)議
    2023-03-03
  • springMVC實(shí)現(xiàn)前臺(tái)帶進(jìn)度條文件上傳的示例代碼

    springMVC實(shí)現(xiàn)前臺(tái)帶進(jìn)度條文件上傳的示例代碼

    本篇文章主要介紹了springMVC實(shí)現(xiàn)前臺(tái)帶進(jìn)度條文件上傳的示例代碼,具有一定的參考價(jià)值,有興趣的可以了解一下。
    2017-01-01
  • Java中Map.merge()方法使用示例詳解

    Java中Map.merge()方法使用示例詳解

    這篇文章主要介紹了Map.merge()方法使用和介紹,本文通過(guò)示例代碼給大家介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或工作具有一定的參考借鑒價(jià)值,需要的朋友可以參考下
    2023-08-08
  • Java+MySQL前后端連接新手小白教程

    Java+MySQL前后端連接新手小白教程

    Java作為一種廣泛使用的編程語(yǔ)言之一,在開(kāi)發(fā)Web應(yīng)用程序時(shí)經(jīng)常需要連接MySQL數(shù)據(jù)庫(kù)進(jìn)行數(shù)據(jù)操作,下面這篇文章主要給大家介紹了關(guān)于Java+MySQL前后端連接的相關(guān)資料,需要的朋友可以參考下
    2024-03-03
  • Java實(shí)現(xiàn)鼠標(biāo)隨機(jī)移動(dòng)效果的示例代碼

    Java實(shí)現(xiàn)鼠標(biāo)隨機(jī)移動(dòng)效果的示例代碼

    有的時(shí)候我們需要鼠標(biāo)一直滑動(dòng)的情況,為了節(jié)省時(shí)間,本文用Java語(yǔ)言寫(xiě)了一個(gè)腳本,可以實(shí)現(xiàn)鼠標(biāo)隨機(jī)移動(dòng),感興趣的小伙伴可以了解一下
    2022-05-05
  • JAVA按字節(jié)讀取文件的簡(jiǎn)單實(shí)例

    JAVA按字節(jié)讀取文件的簡(jiǎn)單實(shí)例

    下面小編就為大家?guī)?lái)一篇JAVA按字節(jié)讀取文件的簡(jiǎn)單實(shí)例。小編覺(jué)得挺不錯(cuò)的,現(xiàn)在就分享給大家,也給大家做個(gè)參考。一起跟隨小編過(guò)來(lái)看看吧
    2016-08-08
  • EasyExcel實(shí)現(xiàn)導(dǎo)入+各種數(shù)據(jù)校驗(yàn)功能

    EasyExcel實(shí)現(xiàn)導(dǎo)入+各種數(shù)據(jù)校驗(yàn)功能

    這篇文章主要介紹了EasyExcel實(shí)現(xiàn)導(dǎo)入+各種數(shù)據(jù)校驗(yàn),本文通過(guò)實(shí)例代碼給大家介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或工作具有一定的參考借鑒價(jià)值,需要的朋友可以參考下
    2023-05-05
  • Springboot整合thymleaf模板引擎過(guò)程解析

    Springboot整合thymleaf模板引擎過(guò)程解析

    這篇文章主要介紹了Springboot整合thymleaf模板引擎過(guò)程解析,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友可以參考下
    2019-11-11
  • SpringCloudAlibaba微服務(wù)調(diào)用組件OpenFeign的方法

    SpringCloudAlibaba微服務(wù)調(diào)用組件OpenFeign的方法

    Feign是Netflix開(kāi)發(fā)的聲明式、模板化的HTTP客戶端,其靈感來(lái)自Retrofit、JAXRS-2.0以及WebSocket,Feign可幫助我們更加便捷、優(yōu)雅地調(diào)用HTTP API,這篇文章主要介紹了SpringCloudAlibaba微服務(wù)調(diào)用組件OpenFeign,需要的朋友可以參考下
    2024-07-07
  • 詳解Spring AOP

    詳解Spring AOP

    本文非常詳細(xì)講解了Spring AOP,本篇文章通過(guò)大量的代碼,講解了Spring AOP的使用,以下就是詳細(xì)內(nèi)容,需要的朋友可以參考下
    2021-08-08

最新評(píng)論

武安市| 额尔古纳市| 施甸县| 钟山县| 安达市| 沙坪坝区| 中西区| 扶绥县| 甘洛县| 罗甸县| 宣汉县| 双桥区| 玉山县| 华蓥市| 嘉鱼县| 宾川县| 浦北县| 巴中市| 金山区| 玉山县| 鄯善县| 泰安市| 闸北区| 黑山县| 安徽省| 尤溪县| 东平县| 富川| 丹巴县| 东至县| 清水县| 扎兰屯市| 太仓市| 阿勒泰市| 乐平市| 班戈县| 广平县| 瑞昌市| 罗甸县| 杂多县| 通渭县|