国产片侵犯亲女视频播放_亚洲精品二区_在线免费国产视频_欧美精品一区二区三区在线_少妇久久久_在线观看av不卡

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

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中的對象轉型

延伸 · 閱讀

精彩推薦
Weibo Article 1 Weibo Article 2 Weibo Article 3 Weibo Article 4 Weibo Article 5 Weibo Article 6 Weibo Article 7 Weibo Article 8 Weibo Article 9 Weibo Article 10 Weibo Article 11 Weibo Article 12 Weibo Article 13 Weibo Article 14 Weibo Article 15 Weibo Article 16 Weibo Article 17 Weibo Article 18 Weibo Article 19 Weibo Article 20 Weibo Article 21 Weibo Article 22 Weibo Article 23 Weibo Article 24 Weibo Article 25 Weibo Article 26 Weibo Article 27 Weibo Article 28 Weibo Article 29 Weibo Article 30 Weibo Article 31 Weibo Article 32 Weibo Article 33 Weibo Article 34 Weibo Article 35 Weibo Article 36 Weibo Article 37 Weibo Article 38 Weibo Article 39 Weibo Article 40
主站蜘蛛池模板: a一级免费视频 | 欧美永久精品 | 精品成人佐山爱一区二区 | 亚洲一区在线观看视频 | 在线色网站 | 在线不卡a资源高清 | 精精国产xxxx视频在线播放 | 欧美日韩亚洲国产 | 久久h| 午夜精品久久久久久久久久久久久 | 免费三级网站 | 在线a∨| 另类一区 | 国产精品久久久久久中文字 | 免费国产一区 | 色视频在线免费观看 | 精品国偷自产国产一区 | 欧美黄色精品 | 樱桃小丸子在线观看 | 国产日韩视频 | 婷婷中文字幕 | 国产精品久久久久久久久福交 | 亚洲国产精品自拍视频 | 国产黄色免费网站 | 亚洲精品久久久久久久久久久 | 精品美女久久久 | 午夜看片 | 97国产精品 | 亚洲电影在线看 | 国产午夜久久 | 日韩精品视频免费在线观看 | 一级一片免费视频 | 黄色毛片看看 | 亚洲一区二区中文字幕 | 日韩av片在线免费观看 | 成人午夜 | 一级在线 | 亚洲精品一区二区三区蜜桃久 | 欧美激情一区二区三级高清视频 | 亚洲精品一区 | 88888888国产一区二区 |