最新国产好看的视频,伊人天堂AV在线,国产Aaaaaa视频,蜜臀视频在线观看一区,人妻av色图,密臀久久久精品影片,青青视频免费观看毛片,久草在线观看视,国产三级精品色情在线

Java編程關(guān)于子類重寫父類方法問題的理解

 更新時(shí)間:2017年11月21日 10:01:09   作者:蟬蟬  
這篇文章主要介紹了Java編程關(guān)于子類重寫父類方法問題的理解,分享了有關(guān)子類重寫父類的實(shí)例,具有一定參考價(jià)值,需要的朋友可以了解下。

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

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

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

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

abstract class A{
	public void a(){
	}
	public abstract void b();
}
public class B extends A{
	//必須重寫b方法,a方法可以不重寫
	public void b(){
	}
}

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

包human中定義了三個(gè)類,Person類、Student類和TestMain類,其中Student類是Person類的子類。代碼分別如下:

Person類的代碼如下:

package human;
public class Person {
	String name;
	int age;
	//test:重寫
	public Person overRide() {
		Person per = new Person();
		per.name = "liu";
		return per;
	}
}

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

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類的代碼如下:

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

輸出結(jié)果為:

 li
 li

有沒有人跟我一樣,第一反應(yīng)輸出應(yīng)該為“l(fā)i liu”呢,怎么兩個(gè)都是“l(fā)i”?

仔細(xì)分析一下,看下面的幾張內(nèi)存圖就明白了。

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

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

stu先調(diào)用overRide(),方法體里創(chuàng)建了一個(gè)子類對象,并讓臨時(shí)變量stu指向該對象,其存儲位置就是以C為首地址的內(nèi)存塊;

然后把該對象的變量name賦值為“l(fā)i”;最后返回stu的值并賦給per,也就是說,雖然per是父類對象引用,但最后指向了overRide()里創(chuàng)建的子類對象,這里以藍(lán)色箭頭表示; 原先指向的以B為首地址的父類對象這時(shí)沒有引用指向它,這里把紅色箭頭變?yōu)樘摼€表示。此時(shí)訪問per的name,顯然是“l(fā)i”。內(nèi)存結(jié)構(gòu)見圖2:

再接著要執(zhí)行per = per.overRide();,調(diào)用overRide()方法;

由于子類重寫了父類的overRide()方法,雖然per為父類對象引用,此時(shí)父類的該方法被覆蓋,所以此時(shí)要調(diào)用子類的方法;執(zhí)行過程同上,per不再指向以C為首地址的子類對象,改為指向新創(chuàng)建的子類對象,以D為首地址,如圖3所示。

同上面一樣的道理,此時(shí)訪問per的name仍然為“l(fā)i”,因?yàn)楦割惖膐verRide()兩次壓根都沒有被調(diào)用到。

修改一下TestMain,如下所示:

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);
		//
	}

此時(shí)定義了一個(gè)父類對象引用per2,并讓它與per指向同一個(gè)對象;最后兩行,由per2調(diào)用overRide()方法,很顯然要調(diào)用父類的方法,所以方法體中創(chuàng)建的也是父類的對象,再把結(jié)果返回給per2,此時(shí)per2指向新創(chuàng)建的父類對象,該父類對象的name就為“l(fā)iu”了。

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

我的理解是,這是為了向上轉(zhuǎn)型;既然子類重寫了父類的方法,有時(shí)候就需要用父類對象引用來調(diào)用子類重寫的方法,在上面例子的情況下,也就是說要把A的子類對象引用賦給A的對象引用,如果此時(shí)返回值類型不是A類或A的子類,其他類的對象引用是不能賦給A的對象引用的,這樣就會出錯(cuò);所以說,子類重寫的方法,如果返回值為類類型,其返回值類型必須與父類返回值類型相同或?yàn)楦割惙祷刂殿愋偷淖宇悺?/p>

不知道有沒有說清楚。

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

總結(jié)

以上就是本文關(guān)于Java編程關(guān)于子類重寫父類方法問題的理解的全部內(nèi)容,希望對大家有所幫助。感興趣的朋友可以繼續(xù)參閱本站:

Java中的靜態(tài)內(nèi)部類詳解及代碼示例

Java源碼解析之object類

Java AtomicInteger類的使用方法詳解

如有不足之處,歡迎留言指出。

相關(guān)文章

  • spring-retry組件的使用教程

    spring-retry組件的使用教程

    Spring Retry的主要目的是為了提高系統(tǒng)的可靠性和容錯(cuò)性,當(dāng)方法調(diào)用失敗時(shí),Spring Retry可以在不影響系統(tǒng)性能的情況下,自動進(jìn)行重試,從而減少故障對系統(tǒng)的影響,這篇文章主要介紹了spring-retry組件的使用,需要的朋友可以參考下
    2023-06-06
  • springBoot中myBatisPlus的使用步驟及示例代碼

    springBoot中myBatisPlus的使用步驟及示例代碼

    MyBatis-Plus 是一個(gè) MyBatis 的增強(qiáng)工具,在 Spring Boot 項(xiàng)目里使用它能極大提升開發(fā)效率,下面為你詳細(xì)介紹在 Spring Boot 中使用 MyBatis-Plus 的步驟以及示例代碼,感興趣的朋友一起看看吧
    2025-03-03
  • java利用多線程和Socket實(shí)現(xiàn)猜拳游戲

    java利用多線程和Socket實(shí)現(xiàn)猜拳游戲

    這篇文章主要為大家詳細(xì)介紹了java利用多線程和Socket實(shí)現(xiàn)猜拳游戲,文中示例代碼介紹的非常詳細(xì),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下
    2020-08-08
  • 遞歸出現(xiàn)棧溢出stackoverflow的問題及解決

    遞歸出現(xiàn)棧溢出stackoverflow的問題及解決

    這篇文章主要介紹了關(guān)于遞歸出現(xiàn)棧溢出stackoverflow的問題及解決方案,具有很好的參考價(jià)值,希望對大家有所幫助。如有錯(cuò)誤或未考慮完全的地方,望不吝賜教
    2022-09-09
  • IntelliJ?IDEA?2021.3永久最新激活至2099年(親測有效)

    IntelliJ?IDEA?2021.3永久最新激活至2099年(親測有效)

    最新版idea2021.3已出來,很多網(wǎng)友迫不及待的要升級idea2021最新版,今天小編抽空給大家整理了一篇教程關(guān)于idea2021.3最新激活教程,本文以idea2021.2.3為例通過圖文并茂的形式給大家分享激活詳細(xì)過程,感興趣的朋友參考下吧
    2020-12-12
  • 一文總結(jié)Java獲取文件后綴名的所有方法

    一文總結(jié)Java獲取文件后綴名的所有方法

    Java是一種應(yīng)用廣泛的編程語言,可以通過多種方式來實(shí)現(xiàn)對文件的操作,如文件名后綴、文件擴(kuò)展名等,下面這篇文章主要給大家介紹了關(guān)于Java獲取文件后綴名的所有方法,需要的朋友可以參考下
    2023-05-05
  • 詳解Java字符型常量和字符串常量的區(qū)別

    詳解Java字符型常量和字符串常量的區(qū)別

    Java 中的字符型常量和字符串常量是兩種不同的數(shù)據(jù)類型,本文將給大家詳細(xì)介紹一下Java字符型常量和字符串常量的區(qū)別,文中通過代碼講解的非常詳細(xì),需要的朋友可以參考下
    2023-10-10
  • 靜態(tài)方法中調(diào)用Spring注入過程解析

    靜態(tài)方法中調(diào)用Spring注入過程解析

    這篇文章主要介紹了靜態(tài)方法中調(diào)用Spring注入過程解析,文中通過示例代碼介紹的非常詳細(xì),對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友可以參考下
    2019-11-11
  • Springboot3.3 整合Cassandra 4.1.5的詳細(xì)過程

    Springboot3.3 整合Cassandra 4.1.5的詳細(xì)過程

    這篇文章主要介紹了Springboot3.3 整合Cassandra 4.1.5的詳細(xì)過程,本文通過實(shí)例代碼給大家介紹的非常詳細(xì),感興趣的朋友跟隨小編一起看看吧
    2024-06-06
  • Springboot中如何自動轉(zhuǎn)JSON輸出

    Springboot中如何自動轉(zhuǎn)JSON輸出

    這篇文章主要介紹了Springboot中如何自動轉(zhuǎn)JSON輸出,具有很好的參考價(jià)值,希望對大家有所幫助。如有錯(cuò)誤或未考慮完全的地方,望不吝賜教
    2022-06-06

最新評論

许昌县| 尖扎县| 乌拉特中旗| 蒙山县| 孙吴县| 新兴县| 河西区| 额敏县| 固阳县| 库车县| 长白| 金山区| 虎林市| 塔城市| 连平县| 奉节县| 大石桥市| 抚远县| 彝良县| 子洲县| 永修县| 延寿县| 晴隆县| 阿拉善左旗| 斗六市| 华蓥市| 鄂伦春自治旗| 澄江县| 呼伦贝尔市| 肃北| 黑龙江省| 苍梧县| 桐梓县| 乐东| 扶余县| 五大连池市| 寻乌县| 建瓯市| 大埔县| 耿马| 和田县|