激情久久久_欧美视频区_成人av免费_不卡视频一二三区_欧美精品在欧美一区二区少妇_欧美一区二区三区的

服務(wù)器之家:專(zhuān)注于服務(wù)器技術(shù)及軟件下載分享
分類(lèi)導(dǎo)航

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

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

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

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

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

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

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

java多態(tài)實(shí)現(xiàn)
java的多態(tài)和c++一樣,是通過(guò)動(dòng)態(tài)綁定或者說(shuō)運(yùn)行時(shí)綁定來(lái)實(shí)現(xiàn)的。當(dāng)調(diào)用某一個(gè)對(duì)象引用的方法時(shí),因?yàn)榫幾g器并不知道這個(gè)引用到底指向的是變量聲明時(shí)說(shuō)明的類(lèi)型對(duì)象,還是該類(lèi)型子類(lèi)的對(duì)象。因此編譯器無(wú)法為這次調(diào)用綁定到具體的某個(gè)方法。只有通過(guò)java中運(yùn)行時(shí)類(lèi)型識(shí)別(RTT)在運(yùn)行時(shí)綁定到具體的方法

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

給出一個(gè)具體例子:

  

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

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

?
1
I am a girl!

p是People的一個(gè)引用,但是在運(yùn)行時(shí)因?yàn)槭荊irl對(duì)象,所以還是調(diào)用了Girl的toString方法


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

測(cè)試題目

?
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

 

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

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

其次,深刻理解這句話(huà)“當(dāng)超類(lèi)對(duì)象引用變量引用子類(lèi)對(duì)象時(shí),被引用對(duì)象的類(lèi)型而不是引用變量的類(lèi)型決定了調(diào)用誰(shuí)的成員方法,但是這個(gè)被調(diào)用的方法必須是在超類(lèi)中定義過(guò)的,也就是說(shuō)被子類(lèi)重寫(xiě)的方法”

然后,我們?cè)趤?lái)分析一下這幾道題目

問(wèn)題:你認(rèn)為B重寫(xiě)了父類(lèi)A的show方法了嗎?如果重寫(xiě)了,重寫(xiě)了幾個(gè)?

答案:重寫(xiě)了,重寫(xiě)了一個(gè),也就是public String show(A obj),為什么public String show(B obj)不算重寫(xiě)父類(lèi)方法呢,很簡(jiǎn)單,因?yàn)閰?shù)類(lèi)型不同

舉例分析
看了上面的分析,我們也來(lái)分析兩個(gè)例子:

一、a2.show(b):

a2是一個(gè)引用變量,類(lèi)型為A,b是B的一個(gè)實(shí)例。首先,在類(lèi)A中找show(B obj),沒(méi)有找到。于是到A的超類(lèi)中找,而A沒(méi)有超類(lèi),因此轉(zhuǎn)向了A.this((super)B),(super)B為A,因此在A中找到了show(A obj)的方法,但是由于a2引用的類(lèi)B的一個(gè)對(duì)象,B重寫(xiě)了A的show(A obj)方法,因此最終鎖定到類(lèi)B的show(A obj),輸出為“B and A”

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

延伸 · 閱讀

精彩推薦
主站蜘蛛池模板: 狠狠操视频网站 | 美女性感毛片 | 国产精品久久久久永久免费 | 午夜国产福利 | 亚洲国产精品久久久 | 石原莉奈日韩一区二区三区 | 精品成人免费一区二区三区 | 久久精品操 | 国产午夜精品一区二区三区免费 | 性欧美videos 另类喷潮 | 8x成人在线电影 | 羞羞视频免费网站入口 | 在线天堂中文在线资源网 | 夜夜夜影院 | 欧美一级毛片免费观看视频 | 成人一级免费视频 | 久久久一区二区三区视频 | 成人久久免费 | 亚洲一级网站 | 美女很黄很黄免费的 | 91精品国产一区二区三区四区在线 | 91久久综合| 国产色视频在线观看免费 | 国产日韩线路一线路二 | 在火车上摸两乳爽的大叫 | 欧美精品一区二区中文字幕 | 538任你躁在线精品视频网站 | 国产精品99精品 | 草b视频在线观看 | 久久久久久久一区二区 | 色片免费在线观看 | 午夜视频在线看 | 国产亚洲精品视频中文字幕 | 成人午夜精品 | 亚洲欧美一区二区三区在线观看 | 成人福利电影在线观看 | 全黄性性激高免费视频 | 久久伊人国产精品 | 日本精品免费观看 | 日韩精品a在线观看 | 天天碰天天操 |