欧美bbbwbbbw肥妇,免费乱码人妻系列日韩,一级黄片

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

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

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

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

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

//實現(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是實現(xiàn)接口InterA的兩個類,分別實現(xiàn)了接口的方法fun(),通過將類B和類C的實例賦給接口引用a,實現(xiàn)了方法在運(yùn)行時的動態(tài)綁定,充分利用了“一個接口,多個方法”,展示了Java的動態(tài)多態(tài)性。

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

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

擴(kuò)展

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

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

一、通過繼承中超類對象引用變量引用子類對象來實現(xiàn)

舉例說明:

//定義超類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的子類,我們在類Test中聲明了3個引用變量a, b, c,通過將子類對象引用賦值給超類對象引用變量來實現(xiàn)動態(tài)方法調(diào)用。也許有人會問:“為什么(1)和(2)不輸出:This is superA”。java 的這種機(jī)制遵循一個原則:當(dāng)超類對象引用變量引用子類對象時,被引用對象的類型而不是引用變量的類型決定了調(diào)用誰的成員方法,但是這個被調(diào)用的方法必須是在超類中定義過的,也就是說被子類覆蓋的方法。

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

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

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

二、通過接口類型變量引用實現(xiàn)接口的類的對象來實現(xiàn)

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

舉例說明:

//定義接口InterA 
interface InterA
{
  void fun();
}
//實現(xiàn)接口InterA的類B 
class B implements InterA
{
  public void fun()
  {
    System.out.println(“This is B”);
  }
}
//實現(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是實現(xiàn)接口InterA的兩個類,分別實現(xiàn)了接口的方法fun(),通過將類B和類C的實例賦給接口引用a而實現(xiàn)了方法在運(yùn)行時的動態(tài)綁定,充分利用了“一個接口,多個方法”展示了Java的動態(tài)多態(tài)性。

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

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

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

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

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

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

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

這個很好理解,因為private說明該方法對子類是不可見的,子類再寫一個同名的方法并不是對父類方法進(jìn)行復(fù)寫(Override),而是重新生成一個新的方法,也就不存在多態(tài)的問題了。同理也可以解釋final,因為方法同樣是不可覆蓋的。

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”。因為靜態(tài)方法是與類而不是與某個對象相關(guān)聯(lián),c.staticMethod();等同于Car.staticMethod(); 所以盡量不要使用實例變量去調(diào)用靜態(tài)方法,避免混淆。

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

相關(guān)文章

  • java實現(xiàn)MapReduce對文件進(jìn)行切分的示例代碼

    java實現(xiàn)MapReduce對文件進(jìn)行切分的示例代碼

    本文主要介紹了java實現(xiàn)MapReduce對文件進(jìn)行切分的示例代碼,文中通過示例代碼介紹的非常詳細(xì),具有一定的參考價值,感興趣的小伙伴們可以參考一下
    2022-01-01
  • 使用springBoot項目配置文件位置調(diào)整到打包外

    使用springBoot項目配置文件位置調(diào)整到打包外

    這篇文章主要介紹了使用springBoot項目配置文件位置調(diào)整到打包外,文中通過示例代碼介紹的非常詳細(xì),對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧
    2021-08-08
  • SpringBoot項目中Controller接收兩個實體的實現(xiàn)方法

    SpringBoot項目中Controller接收兩個實體的實現(xiàn)方法

    本文主要介紹了SpringBoot項目中Controller接收兩個實體的實現(xiàn)方法,主要介紹了兩種方法,具有一定的參考價值,感興趣的可以了解一下
    2023-08-08
  • Java并發(fā)框架:Executor API詳解

    Java并發(fā)框架:Executor API詳解

    這篇文章主要介紹了Java并發(fā)框架:Executor API詳解,隨著當(dāng)今處理器中可用的核心數(shù)量的增加, 隨著對實現(xiàn)更高吞吐量的需求的不斷增長,多線程 API 變得非常流行。 Java 提供了自己的多線程框架,稱為 Executor 框架,需要的朋友可以參考下
    2019-07-07
  • SpringBoot validator參數(shù)驗證restful自定義錯誤碼響應(yīng)方式

    SpringBoot validator參數(shù)驗證restful自定義錯誤碼響應(yīng)方式

    這篇文章主要介紹了SpringBoot validator參數(shù)驗證restful自定義錯誤碼響應(yīng)方式,具有很好的參考價值,希望對大家有所幫助。如有錯誤或未考慮完全的地方,望不吝賜教
    2021-10-10
  • SpringBoot?如何從容器中獲取對象

    SpringBoot?如何從容器中獲取對象

    這篇文章主要介紹了SpringBoot?如何從容器中獲取對象,具有很好的參考價值,希望對大家有所幫助。如有錯誤或未考慮完全的地方,望不吝賜教
    2022-08-08
  • 詳解Springboot如何通過注解實現(xiàn)接口防刷

    詳解Springboot如何通過注解實現(xiàn)接口防刷

    本文主要為大家介紹一種極簡潔、靈活通用接口防刷實現(xiàn)方式、通過在需要防刷的方法加上@Prevent?注解即可實現(xiàn)短信防刷,感興趣的可以了解一下
    2022-09-09
  • java PDF添加圖層的方法 支持多頁圖層添加

    java PDF添加圖層的方法 支持多頁圖層添加

    這篇文章主要為大家詳細(xì)介紹了java PDF添加圖層的方法,支持多頁圖層添加,具有一定的參考價值,感興趣的小伙伴們可以參考一下
    2018-02-02
  • Java Swing組件編程之JTable表格用法實例詳解

    Java Swing組件編程之JTable表格用法實例詳解

    這篇文章主要介紹了Java Swing組件編程之JTable表格用法,結(jié)合實例形式詳細(xì)分析了Swing組件中JTable表格的常見定義與使用方法,需要的朋友可以參考下
    2017-11-11
  • Maven Repository倉庫的具體使用

    Maven Repository倉庫的具體使用

    本文主要介紹了Maven Repository倉庫的具體使用,文中通過示例代碼介紹的非常詳細(xì),對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧
    2023-05-05

最新評論