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

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

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

服務器之家 - 編程語言 - Java教程 - Java編程關于子類重寫父類方法問題的理解

Java編程關于子類重寫父類方法問題的理解

2021-02-14 22:35蟬蟬 Java教程

這篇文章主要介紹了Java編程關于子類重寫父類方法問題的理解,分享了有關子類重寫父類的實例,具有一定參考價值,需要的朋友可以了解下。

子類重新實現父類的方法稱重寫;重寫時可以修改訪問權限修飾符和返回值,方法名和參數類型及個數都不可以修改;僅當返回值為類類型時,重寫的方法才可以修改返回值類型,且必須是父類方法返回值的子類;要么就不修改,與父類返回值類型相同。那么,該如何理解呢?為什么要是父類返回值類型的子類?

提出問題:子類必須重寫父類所有方法嗎?

java,子類不是必須重寫父類所有方法的,分為以下兩種情況:

父類方法為抽象方法時,子類必須重寫(實現)所有父類的抽象方法;
父類方法為普通方法時,子類可以重寫父類方法,也可以不重寫。
舉例如下:

?
1
2
3
4
5
6
7
8
9
10
abstract class a{
    public void a(){
    }
    public abstract void b();
}
public class b extends a{
    //必須重寫b方法,a方法可以不重寫
    public void b(){
    }
}

還是先看示例,詳見下文。

包human中定義了三個類,person類、student類和testmain類,其中student類是person類的子類。代碼分別如下:

person類的代碼如下:

?
1
2
3
4
5
6
7
8
9
10
11
package human;
public class person {
    string name;
    int age;
    //test:重寫
    public person override() {
        person per = new person();
        per.name = "liu";
        return per;
    }
}

student類重寫了父類的override()方法,代碼如下:

?
1
2
3
4
5
6
7
8
9
10
11
package human;
public class student extends person {
    string stunumber;
    int score;
    //test:重寫
    public student override() {
        student stu = new student();
        stu.name = "li";
        return stu;
    }
}

testmain類的代碼如下:

?
1
2
3
4
5
6
7
8
9
10
package human;
public class testmain {
    public static void main(string[] args) {
        student stu = new student();
        person per = new person();
        per = stu.override();
        system.out.println(per.name);
        per = per.override();
        system.out.println(per.name);
    }

輸出結果為:

?
1
2
li
li

有沒有人跟我一樣,第一反應輸出應該為“li liu”呢,怎么兩個都是“li”?

仔細分析一下,看下面的幾張內存圖就明白了。

第1、第2條語句分別創建一個子類對象和一個父類對象,其中,stu指向子類對象,per指向父類對象。如下面圖1所示:

Java編程關于子類重寫父類方法問題的理解

接著執行第3條語句:per = stu.override();;

stu先調用override(),方法體里創建了一個子類對象,并讓臨時變量stu指向該對象,其存儲位置就是以c為首地址的內存塊;

然后把該對象的變量name賦值為“li”;最后返回stu的值并賦給per,也就是說,雖然per是父類對象引用,但最后指向了override()里創建的子類對象,這里以藍色箭頭表示; 原先指向的以b為首地址的父類對象這時沒有引用指向它,這里把紅色箭頭變為虛線表示。此時訪問per的name,顯然是“li”。內存結構見圖2:

Java編程關于子類重寫父類方法問題的理解

再接著要執行per = per.override();,調用override()方法;

由于子類重寫了父類的override()方法,雖然per為父類對象引用,此時父類的該方法被覆蓋,所以此時要調用子類的方法;執行過程同上,per不再指向以c為首地址的子類對象,改為指向新創建的子類對象,以d為首地址,如圖3所示。

同上面一樣的道理,此時訪問per的name仍然為“li”,因為父類的override()兩次壓根都沒有被調用到。

Java編程關于子類重寫父類方法問題的理解

修改一下testmain,如下所示:

?
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
package human;
public class testmain {
    public static void main(string[] args) {
        student stu = new student();
        person per = new person();
        person per2 = per;
        //    per = stu.override();
        system.out.println(per.name);
        per = per.override();
        system.out.println(per.name);
        per2 = per2.override();
        //
        system.out.println(per2.name);
        //
    }

此時定義了一個父類對象引用per2,并讓它與per指向同一個對象;最后兩行,由per2調用override()方法,很顯然要調用父類的方法,所以方法體中創建的也是父類的對象,再把結果返回給per2,此時per2指向新創建的父類對象,該父類對象的name就為“liu”了。

說了這么多,貌似還沒解決開頭的問題,為什么是父類返回值類型的子類?為方便說明,記父類的返回值類型為a。

我的理解是,這是為了向上轉型;既然子類重寫了父類的方法,有時候就需要用父類對象引用來調用子類重寫的方法,在上面例子的情況下,也就是說要把a的子類對象引用賦給a的對象引用,如果此時返回值類型不是a類或a的子類,其他類的對象引用是不能賦給a的對象引用的,這樣就會出錯;所以說,子類重寫的方法,如果返回值為類類型,其返回值類型必須與父類返回值類型相同或為父類返回值類型的子類。

不知道有沒有說清楚。

ps:例子選得不是特別好,如果返回值類型是與person和student不相干的類,可能更好理解,不然容易把返回值的類與方法所屬的類混淆。

總結

以上就是本文關于java編程關于子類重寫父類方法問題的理解的全部內容,希望對大家有所幫助。如有不足之處,歡迎留言指出。

原文鏈接:http://www.cnblogs.com/chanchan/p/7796472.html

延伸 · 閱讀

精彩推薦
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
主站蜘蛛池模板: 亚洲国产精品一区在线 | 日韩欧美专区 | 国产精品久久久久久久7电影 | 色乱码一区二区三区网站 | 毛片无码国产 | 婷婷色综合 | 国产美女www爽爽爽免费视频 | 亚洲国产高清在线 | 亚洲成人三区 | 亚洲国产精品久久 | 午夜久久久 | 精品一区二区久久久久黄大片 | 亚洲视频在线观看 | 日韩在线播放一区 | 国产欧美日韩在线观看 | 五月天狠狠爱 | 69久久| 91av入口 | 色欧美片视频在线观看 | 中文字幕视频三区 | 免费av在线| 国产精品美女久久久av超清 | 亚洲成av人片在线观看无码 | 中文字幕在线观看av | 精品一区二区免费视频 | 国产精品视频入口 | 天天夜夜操 | 91国内外精品自在线播放 | av在线日韩 | 国产精品亚洲综合 | 精品久久久久久久久久久 | 久久久久久久国产精品免费播放 | 午夜免费| 国产精品久久久久久福利一牛影视 | 在线中文av | 亚洲一区二区在线 | 国产一区二区三区免费观看 | 不卡的一区二区 | 黄色在线观看视频网站 | 国产精品久久久久一区二区三区 | 另类sb东北妇女av |