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

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

PHP教程|ASP.NET教程|JAVA教程|ASP教程|

服務器之家 - 編程語言 - JAVA教程 - 進一步理解Java中的多態(tài)概念

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

2020-01-02 14:36zinss26914 JAVA教程

這篇文章主要介紹了進一步理解Java中的多態(tài)概念,是Java入門學習中的基礎知識,需要的朋友可以參考下

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

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

java多態(tài)實現(xiàn)
java的多態(tài)和c++一樣,是通過動態(tài)綁定或者說運行時綁定來實現(xiàn)的。當調用某一個對象引用的方法時,因為編譯器并不知道這個引用到底指向的是變量聲明時說明的類型對象,還是該類型子類的對象。因此編譯器無法為這次調用綁定到具體的某個方法。只有通過java中運行時類型識別(RTT)在運行時綁定到具體的方法

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

給出一個具體例子:

  

?
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
41
42
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());
 }
}

運行結果是:

?
1
I am a girl!

p是People的一個引用,但是在運行時因為是Girl對象,所以還是調用了Girl的toString方法


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

測試題目

?
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
41
42
43
44
45
46
47
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
 }
}

 

答案

?
1
2
3
4
5
6
7
8
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

 

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

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

其次,深刻理解這句話“當超類對象引用變量引用子類對象時,被引用對象的類型而不是引用變量的類型決定了調用誰的成員方法,但是這個被調用的方法必須是在超類中定義過的,也就是說被子類重寫的方法”

然后,我們在來分析一下這幾道題目

問題:你認為B重寫了父類A的show方法了嗎?如果重寫了,重寫了幾個?

答案:重寫了,重寫了一個,也就是public String show(A obj),為什么public String show(B obj)不算重寫父類方法呢,很簡單,因為參數(shù)類型不同

舉例分析
看了上面的分析,我們也來分析兩個例子:

一、a2.show(b):

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

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

延伸 · 閱讀

精彩推薦
主站蜘蛛池模板: 国产精品九九免费视频 | 日噜噜 | 国产人成激情视频在线观看 | 国产精品久久久久久福利 | h版在线观看 | 青草福利在线 | 国产高清经典露脸3p | 欧洲美女啪啪 | 啊哈用力cao我 | 国产免费资源高清小视频在线观看 | 校园全肉高h湿一女多男 | 精品视频入口 | 波多野结衣亚洲一区 | 日本一片免费观看高清完整 | 极品丝袜乱系列在线阅读 | 国产精品主播在线 | 婷婷综合缴情亚洲五月伊 | 思思玖玖 | www.亚洲5555.com| 精品一久久香蕉国产线看观 | 91香蕉导航 | 国产探花在线观看 | 2023毛片| 午夜福利电影网站鲁片大全 | 精品无码久久久久久久动漫 | 污黄在线观看 | 二次元美女脱裤子让男人桶爽 | www.国产自拍 | 国产日本久久久久久久久婷婷 | 国产123区 | 日产2021免费一二三四区 | 男人女人叉叉叉 | 午夜电影三级还珠格格 | 精品亚洲视频在线观看 | 国产一区二区三区久久精品 | 四虎在线精品免费高清在线 | 91精品国产亚洲爽啪在线影院 | 久久草香蕉频线观 | 日本韩国一区二区三区 | 亚洲狼人综合干 | 禁欲天堂|