一区二区三区在线-一区二区三区亚洲视频-一区二区三区亚洲-一区二区三区午夜-一区二区三区四区在线视频-一区二区三区四区在线免费观看

服務器之家:專注于服務器技術及軟件下載分享
分類導航

PHP教程|ASP.NET教程|Java教程|ASP教程|編程技術|正則表達式|C/C++|IOS|C#|Swift|Android|VB|R語言|JavaScript|易語言|vb.net|

服務器之家 - 編程語言 - Java教程 - Java多態和實現接口的類的對象賦值給接口引用的方法(推薦)

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

2020-08-15 17:44Java教程網 Java教程

下面小編就為大家帶來一篇Java多態和實現接口的類的對象賦值給接口引用的方法(推薦)。小編覺得挺不錯的,現在就分享給大家,也給大家做個參考。一起跟隨小編過來看看吧

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

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

?
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
//定義接口InterA
interface InterA
{
 void fun();
}
//實現接口InterA的類B
class B implements InterA
{
 public void fun()
 {
  System.out.println(“This is B”);
 }
}
 
//實現接口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();
 }
}

輸出結果為:

?
1
2
This is B
This is C

上例中類B和類C是實現接口InterA的兩個類,分別實現了接口的方法fun(),通過將類B和類C的實例賦給接口引用a,實現了方法在運行時的動態綁定,充分利用了“一個接口,多個方法”,展示了Java的動態多態性。

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

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

擴展

Java運行時多態性:繼承和接口的實現

Java是面向對象的語言,而運行時多態性是面向對象程序設計代碼重用的一個最強大機制,動態性的概念也可以被說成“一個接口,多個方法”。Java實現運行時多態性的基礎是動態方法調度,它是一種在運行時而不是在編譯期調用重載方法的機制,下面就繼承和接口實現兩方面談談java運行時多態性的實現。

一、通過繼承中超類對象引用變量引用子類對象來實現

舉例說明:

?
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
//定義超類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)
  }

運行結果為:

?
1
2
3
This is subB
 
This is subC

上述代碼中subB和subC是超類superA的子類,我們在類Test中聲明了3個引用變量a, b, c,通過將子類對象引用賦值給超類對象引用變量來實現動態方法調用。也許有人會問:“為什么(1)和(2)不輸出:This is superA”。java 的這種機制遵循一個原則:當超類對象引用變量引用子類對象時,被引用對象的類型而不是引用變量的類型決定了調用誰的成員方法,但是這個被調用的方法必須是在超類中定義過的,也就是說被子類覆蓋的方法。

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

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

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

二、通過接口類型變量引用實現接口的類的對象來實現

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

舉例說明:

?
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
//定義接口InterA
interface InterA
{
  void fun();
}
//實現接口InterA的類B
class B implements InterA
{
  public void fun()
  {
    System.out.println(“This is B”);
  }
}
//實現接口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();
  }
}

輸出結果為:

?
1
2
3
This is B
 
This is C

上例中類B和類C是實現接口InterA的兩個類,分別實現了接口的方法fun(),通過將類B和類C的實例賦給接口引用a而實現了方法在運行時的動態綁定,充分利用了“一個接口,多個方法”展示了Java的動態多態性。

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

結束語:以上就是java運行時多態性的實現方法,大家在編程過程中可以靈活運用,但是在性能要求較高的代碼中不提倡運用運行時多態,畢竟Java的運行時動態方法調用較之普通的方法調用的系統開銷是比較大的。

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

Java靜態方法不具有多態性詳解

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

然而動態綁定在以下兩種情況會失效。

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

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

2、方法是static修飾的

代碼如下所示.

?
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
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();
 }
}

輸出結果如下:

?
1
2
Base staticMehtod
Sub dynamicMehtod

輸出結果并不像設想的那樣,輸出 “Sub staticMehtod”。因為靜態方法是與類而不是與某個對象相關聯,c.staticMethod();等同于Car.staticMethod(); 所以盡量不要使用實例變量去調用靜態方法,避免混淆。

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

延伸 · 閱讀

精彩推薦
主站蜘蛛池模板: 厨房里摸着乳丰满在线观看 | 亚洲精品九色在线网站 | 99热精品在线免费观看 | 外国黄色软件 | 久久亚洲一级α片 | 国产精品久久久久久五月尺 | 午夜爱| 激情视频激情小说 | 国产成人精品999在线 | 青青青久热国产精品视频 | 深夜国产在线 | 男生操女生的漫画 | 日本不卡一区二区三区在线观看 | 成人私人影院在线观看网址 | 黑人巨鞭大战白妞10级 | 色在线亚洲视频www 色欲麻豆国产福利精品 | 国产成人在线免费视频 | 丫鬟粗大狠狠贯穿h | 欧美日韩国产亚洲人成 | 97色综合 | 黑人干亚洲人 | 2012在线观看免费视频大全 | 2022国产在线观看 | 国产精品伊人 | 色猪视频 | 麻豆天美精东果冻传媒在线 | 香蕉国产成版人视频在线观看 | 亚洲精品午夜视频 | av在线亚洲男人的天堂 | 四虎4hu永久免费 | 极品虎白女在线观看一线天 | www一区二区 | 91在线播| 国产精品视频一区二区三区不卡 | 国产精品国产高清国产专区 | 高清欧美不卡一区二区三区 | 欧美日韩国产在线人成 | 久久青青草原精品国产软件 | 福利社在线免费观看 | 天堂va亚洲va欧美va国产 | 单亲乱l仑在线观看免费观看 |