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

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

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

延伸 · 閱讀

精彩推薦
主站蜘蛛池模板: 亚洲天堂日韩在线 | 亚洲精品视频一区 | 九九99热久久精品在线6 | 水岛津实在线 | 成人丁香乱小说 | 4hu影院永久在线播放 | 女人张开腿让男人桶视频免费大全 | 人皮高跟鞋在线观看 | 久久免费看少妇级毛片蜜臀 | 日本无遮挡吸乳视频看看 | 日韩高清在线高清免费 | 韩国三级在线高速影院 | 欧美精品一区二区三区久久 | 亚洲第一页综合 | 热久久天天拍天天拍热久久2018 | 国产一成人精品福利网站 | 国内精品久久久久久野外 | 高清视频免费 | 亚洲欧美日韩在线观看看另类 | 亚洲成人第一页 | 国模娜娜a4u1546全套 | h黑寡妇一级毛片 | 日本在线观看视频 | 忘忧草研究院一二三 | 免费观看无遮挡www的小视频 | 日韩理论片在线看免费观看 | 亚洲热在线视频 | 成人区精品一区二区毛片不卡 | 91李宗精品72集在线观看 | 成人精品亚洲人成在线 | 向日葵视频app下载18岁以下勿看 | 97porm自拍视频区原创 | 555www成人网 | 先锋资源久久 | 美女被草逼 | 亚洲无人区乱码中文字幕 | 果冻传媒林予曦图片 | 亚洲欧美日韩在线观看看另类 | 98色花堂永久地址国产精品 | 胖女性大bbbbbb| 韩国三级年轻小的胰子完整 |