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

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

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

服務器之家 - 編程語言 - Java教程 - 詳細講述Java中的對象轉型

詳細講述Java中的對象轉型

2021-06-04 13:47Java之家 Java教程

在本篇文章里我們給大家詳細分享了關于Java中的對象轉型的知識點內容,有興趣的朋友們學習下。

向上轉型:子類對象轉為父類,父類可以是接口。公式:father f = new son();father是父類或接口,son是子類。

向下轉型:父類對象轉為子類。公式:son s = (son)f;

詳細講述Java中的對象轉型

我們將形參設為父類animal類型,當執行test.f(c)時,內存情況如下圖:

詳細講述Java中的對象轉型

c作為cat類型傳入,animal a作為形參,相當于執行了animal a = new cat(),這時a和c同時指向cat對象,但此時a不能訪問cat類擴展的數據成員,所以再將a強轉成cat類型即可。如果不存在這樣的轉型機制,則針對貓和狗我們還要分別寫兩個函數f(cat c)和f(dog d)。但其實上圖程序的可擴展性也不是最好的。我們還可以利用動態綁定(即多態)將擴展性進一步提升。多態機制的三個前提分別是:

(1)要有繼承

(2)要重寫,即子類對父類中某些方法進行重新定義

(3)要向上轉型,用父類引用指向子類對象。

下面來看一個例子:

?
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
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
class animal { private string name; /**
  * 在animal類自定義的構造方法
  * @param name  */
 animal(string name) {  this.name = name;
 } /**
  * 在animal類里面自定義一個方法enjoy  */
 public void enjoy() {
  system.out.println("動物的叫聲……");
 }
}class cat extends animal { private string eyescolor; /**
  * 在子類cat里面定義cat類的構造方法
  * @param n
  * @param c  */
 cat(string n, string c) {  /**
   * 在構造方法的實現里面首先使用super調用父類animal的構造方法animal(string name)。
   * 把子類對象里面的父類對象先造出來。   */
  super(n);
  eyescolor = c;
 } /**
  * 子類cat對從父類animal繼承下來的enjoy方法不滿意,在這里重寫了enjoy方法。  */
 public void enjoy() {
  system.out.println("我養的貓高興地叫了一聲……");
 }
}/**
 * 子類dog從父類animal繼承下來,dog類擁有了animal類所有的屬性和方法。
 * @author gacl
 * */class dog extends animal { /**
  * 在子類dog里面定義自己的私有成員變量  */
 private string furcolor; /**
  * 在子類dog里面定義dog類的構造方法
  * @param n
  * @param c  */
 dog(string n, string c) {  /**
   * 在構造方法的實現里面首先使用super調用父類animal的構造方法animal(string name)。
   * 把子類對象里面的父類對象先造出來。   */
  super(n);
  furcolor = c;
 } /**
  * 子類dog對從父類animal繼承下來的enjoy方法不滿意,在這里重寫了enjoy方法。  */
 public void enjoy() {
  system.out.println("我養的狗高興地叫了一聲……");
 }
}/**
 * 子類bird從父類animal繼承下來,bird類擁有animal類所有的屬性和方法
 * @author gacl
 * */class bird extends animal { /**
  * 在子類bird里面定義bird類的構造方法  */
 bird() {  /**
   * 在構造方法的實現里面首先使用super調用父類animal的構造方法animal(string name)。
   * 把子類對象里面的父類對象先造出來。   */
  super("bird");
 } /**
  * 子類bird對從父類animal繼承下來的enjoy方法不滿意,在這里重寫了enjoy方法。  */
 public void enjoy() {
  system.out.println("我養的鳥高興地叫了一聲……");
 }
}/**
 * 定義一個類lady(女士)
 * @author gacl
 * */class lady { /**
  * 定義lady類的私有成員變量name和pet  */
 private string name; private animal pet; /**
  * 在lady類里面定義自己的構造方法lady(),
  * 這個構造方法有兩個參數,分別為string類型的name和animal類型的pet,
  * 這里的第二個參數設置成animal類型可以給我們的程序帶來最大的靈活性,
  * 因為作為養寵物來說,可以養貓,養狗,養鳥,只要是你喜歡的都可以養,
  * 因此把它設置為父類對象的引用最為靈活。
  * 因為這個animal類型的參數是父類對象的引用類型,因此當我們傳參數的時候,
  * 可以把這個父類的子類對象傳過去,即傳dog、cat和bird等都可以。
  * @param name
  * @param pet  */
 lady(string name, animal pet) {  this.name = name;  this.pet = pet;
 } /**
  * 在lady類里面自定義一個方法mypetenjoy()
  * 方法體內是讓lady對象養的寵物自己調用自己的enjoy()方法發出自己的叫聲。  */
 public void mypetenjoy() {
  pet.enjoy();
 }
}public class jerque { public static void main(string args[]) {  /**
   * 在堆內存里面new了一只藍貓對象出來,這個藍貓對象里面包含有一個父類對象animal。   */
  cat c = new cat("catname", "blue");  /**
   * 在堆內存里面new了一只黑狗對象出來,這個黑狗對象里面包含有一個父類對象animal。   */
  dog d = new dog("dogname", "black");  /**
   * 在堆內存里面new了一只小鳥對象出來,這個小鳥對象里面包含有一個父類對象animal。   */
  bird b = new bird();  /**
   * 在堆內存里面new出來3個小姑娘,名字分別是l1,l2,l3。
 * l1養了一只寵物是c(cat),l2養了一只寵物是d(dog),l3養了一只寵物是b(bird)。
   * 注意:調用lady類的構造方法時,傳遞過來的c,d,b是當成animal來傳遞的,
   * 因此使用c,d,b這三個引用對象只能訪問父類animal里面的enjoy()方法。   */
  lady l1 = new lady("l1", c);
  lady l2 = new lady("l2", d);
  lady l3 = new lady("l3", b);  /**
   * 這三個小姑娘都調用mypetenjoy()方法使自己養的寵物高興地叫起來。   */
  l1.mypetenjoy();
  l2.mypetenjoy();
  l3.mypetenjoy();
 }
}

上面的例子中,我們發現,如果我們想要加入新的動物,只需定義相應的類繼承animal,完全不用動任何一處代碼,因為這里運用了面向對象最核心的東西——多態。與之前的例子不同,雖然我們一直強調當用父類的引用指向子類對象,父類無法訪問子類自己的成員,但是方法與數據成員不同,具體調哪一個方法是等到運行時決定的,new出了什么對象就調用相應對象的方法,取決于實際new出的對象而不是指向對象的引用,所以當傳入不同動物類型,mypetenjoy()就會去執行不同的方法

詳細講述Java中的對象轉型

延伸 · 閱讀

精彩推薦
主站蜘蛛池模板: 热99精品 | 果冻传媒mv在线观看入口免费 | 性做久久久久久久久浪潮 | 欧美一区二区三区大片 | 边摸边吃奶边做爽gif动态图 | 99re8在线精品视频免费播放 | 亚洲v成人天堂影视 | 国产精品免费久久久久影院小说 | 黑帮少爷爱上我第8集最新 荷兰精品女人性hd 和日本免费不卡在线v | 欧美大奶艳星 | 无人影院在线播放视频 | 美女和男生搞基 | 窝窝午夜精品一区二区 | 黑帮大佬与我的365天2标清中文 | 国产精品一久久香蕉产线看 | 婷婷国产在线 | 狠狠色婷婷日日综合五月 | 日本欧美强乱视频在线 | 日韩国产欧美成人一区二区影院 | 91素人约啪 | 亚洲精品成人在线 | 草莓香蕉绿巨人丝瓜榴莲污在线观看 | 国产精品美女福利视频免费专区 | 男女激情视频1000辣妞范 | zoo性欧美 | 9420高清完整版在线观看国语 | 国产福利一区二区精品视频 | 欧美亚洲第一页 | 美女免费观看一区二区三区 | 国产四虎| 青青热久麻豆精品视频在线观看 | 男人操美女逼视频 | 王晶三级作品 | 四虎伊人| 久久理论片迅播影院一级 | 色批网站www | 电车痴汉(han) | 日本黄色影院 | 亚洲欧洲日产国码天堂 | 亚洲天堂在线视频播放 | 美女视频黄a |