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

一文帶你搞懂Java中方法重寫與方法重載的區(qū)別

 更新時間:2023年05月09日 14:19:59   作者:一一哥Sun  
這篇文章主要介紹了Java中方法重寫與方法重載有哪些區(qū)別,文中有詳細的代碼示例,對大家的學(xué)習(xí)或工作有一定的幫助,需要的朋友可以參考下

一. 方法重寫

在面向?qū)ο笾?,實現(xiàn)多態(tài)的必備條件是繼承、重寫和向上轉(zhuǎn)型,現(xiàn)在我們已經(jīng)學(xué)習(xí)了什么是繼承。接下來我們再來學(xué)習(xí)什么是方法重寫,這是我們能夠?qū)崿F(xiàn)多態(tài)的前提。

1. 概念

如果我們在子類中,創(chuàng)建了一個與父類中名稱、返回值類型、參數(shù)列表都完全相同的方法,只是方法體的功能實現(xiàn)不同,這種方式被稱為方法重寫(override) ,或者叫方法覆蓋。當(dāng)父類中的方法無法滿足子類的需求,或者子類需要有特殊功能時,就可以進行方法重寫。

2. 基本要求

我們在進行方法重寫時,需要遵循以下幾點要求:

  • 父類的成員方法只能被它的子類重寫,即不能繼承一個方法,就不能重寫這個方法;
  • 被final修飾的方法不能被重寫;
  • 被static修飾的方法不能被重寫,但可以再次聲明;
  • 構(gòu)造方法不能被重寫;
  • 子類和父類在同一個包中時,子類可以重寫父類中除了被private和final修飾的其他所有方法;
  • 子類和父類不在同一個包中時,子類只能重寫父類被public和protected修飾的非final方法;
  • 重寫的方法建議使用@Override注解來標(biāo)識。

3. 注意事項

另外我們在進行方法重寫時,還要注意以下幾點:

  • 方法簽名要相同:重寫的方法和被重寫的方法,在方法名、參數(shù)上都要相同;
  • 返回值類型一致:JDK 1.5之前重寫方法的返回值類型必須一樣,但之后的Java版本放寬了限制,返回值類型必須小于或等于父類方法的返回值類型;
  • 訪問修飾符要更寬泛:子類重寫父類的方法時,子類方法中的訪問修飾符不能比父類中的更嚴格(public>protected>default>private)。比如父類方法的修飾符是protected,則子類的同名方法其修飾符可以是protected或public,但不能是默認的或private;
  • 聲明的異常類型要一致:重寫的方法一定不能拋出新的檢査異常,或者比被重寫方法聲明更寬泛的檢査型異常。例如,父類的方法聲明了IOException,重寫該方法時就不能拋出Exception,只能拋出IOException或其子類異常。但可以拋出非檢査異常。

4. 代碼實現(xiàn)

接下來就通過一個案例來給大家講解方法的重寫該怎么實現(xiàn)。

4.1 定義父類

我們先定義一個Father父類,要注意父類中有哪些方法不能被重寫。

public class Father {
    // 父類中的成員變量--變量隱藏
    String name="老子";
	
    //構(gòu)造方法不能被重寫,因為構(gòu)造方法不能被繼承!
    public Father() {
	System.out.println("爹的構(gòu)造方法");
    }

    // 吃
    public void eat() {
	System.out.println("爹吃饅頭");
    }

    // 喝
    public void drink() {
	System.out.println("爹喝水");
    }
	
    // 玩
    //私有方法不能被重寫
    //	private void play() {
    //       System.out.println("爹玩火");
    //	}
	
    //靜態(tài)方法不能被重寫,但可以在子類中聲明一個同樣的靜態(tài)方法。
    //	public static void play() {
    //      System.out.println("爹玩火");
    //	}
	
    //final方法不能被重寫
    public final void play() {
	System.out.println("爹玩火");
    }
}

4.2 定義子類

定義一個Son子類繼承父類,有了繼承才會有重寫!

public class Son extends Father{
    //構(gòu)造方法不能被重寫,因為構(gòu)造方法不能被繼承!
    //@Override
    //public Father() {}

    // 吃
    /**
    * 方法重寫時可以帶有@Ovriride關(guān)鍵詞,當(dāng)重寫的方法簽名不一致時,可以有編譯錯誤的提示。
    * 否則方法簽名不一致時不會有錯誤提示,會被當(dāng)做一個新的方法來處理。
    */
    @Override
    public void eat() {
	//如果子類的功能,是在父類的基礎(chǔ)之上進行的額外擴展增加,
	//我們可以使用super關(guān)鍵字調(diào)用父類的同名方法,然后再進行自己的額外擴展!
	//如果子類的實現(xiàn)和父類完全不一樣,可以不調(diào)用super!
	super.eat();
	//方法重寫時,子類可以對父類的同名方法進行擴展實現(xiàn),方法體的內(nèi)容可以和父類中的實現(xiàn)不一樣
	System.out.println("兒子吃肉");
    }

    // 喝
    @Override
    public void drink() {
	//如果子類的實現(xiàn)和父類完全不一樣,可以不調(diào)用super!
	System.out.println("兒子喝酒");
    }
    /**
    * 父類私有的、static、final等方法無法被重寫
    */
    //@Override
    //public void play() {}
	
    //static靜態(tài)的父類方法不能被重寫,但可以在子類中再重新編寫一個靜態(tài)的同名方法。
    //public static void play() {}

    //變量隱藏--調(diào)用父類和子類中的同名成員變量
    public void sayHello() {
	// 如果子類的實現(xiàn)和父類完全不一樣,可以不調(diào)用super!
	System.out.println("父親的名字=" + super.name);
	System.out.println("兒子的名字=" + name);
    }

    public static void main(String[] args) {
	Son son = new Son();
	son.sayHello();
    }
}

我們在進行方法重寫時,要注意以下幾點:

  • 方法重寫時可以帶有@Ovriride關(guān)鍵詞。當(dāng)重寫的方法簽名不一致時,會有編譯錯誤的提示,否則方法簽名不一致時不會有錯誤提示,會被當(dāng)做一個新的方法來處理。
  • 當(dāng)子類對象調(diào)用重寫的方法時,默認執(zhí)行的是子類的方法,而不是父類中被重寫的方法。如果我們想要調(diào)用父類中被重寫的方法,則可以使用“super.方法名”的形式。
  • 如果子類的功能是在父類的基礎(chǔ)之上進行的額外擴展,我們可以使用super關(guān)鍵字調(diào)用父類的同名方法,然后再進行自己的額外擴展!
  • 如果子類的實現(xiàn)和父類完全不一樣,可以不調(diào)用super!
  • 方法重寫時,子類可以對父類的同名方法進行擴展實現(xiàn),方法體的內(nèi)容可以和父類中的實現(xiàn)不一樣。

4.3 @Override注解

在上面的代碼中,我們用到了一個新的關(guān)鍵字@Override。在Java中,@Override是一個注解,關(guān)于注解的更多內(nèi)容,會在后面的文章中進行專門講解,現(xiàn)在我們先知道注解這個概念就行。

@Override是一個用來修飾被重新的方法的注解,只能用在被重新的方法上,不能用在其它的地方。該注解可以強制子類必須重寫父類的方法或者接口中的方法,主要是告訴編譯器檢查重寫的方法是否和父類中定義的一致。如果重寫的方法簽名不一致,會提示編譯錯誤。如果方法簽名不一致,則不會有錯誤提示,會被當(dāng)做一個新的方法來處理。通過這樣的機制,就可以避免程序員出現(xiàn)一些低級的錯誤。

5. 變量隱藏

5.1 概念

如果子類中定義了一個成員變量,而該變量的名稱與父類中的成員變量相同,數(shù)據(jù)類型不一定完全一致,我們就把這稱為變量隱藏。也就是說,子類的成員變量,對從父類繼承過來的成員變量進行了重新定義,出現(xiàn)了子類變量對父類變量的隱藏。所以子類執(zhí)行自己定義的方法時,操作的成員變量默認是自己定義的變量,而不是父類中的同名變量。如果我們非要操作隱藏的成員變量,可以使用super關(guān)鍵字進行調(diào)用。

接下來我們通過一個案例來給大家演示變量隱藏的使用。

5.2 案例實現(xiàn)

父類中定義一個成員變量name,如下圖所示:

子類中也定義一個相同的成員變量name,如下圖所示:

如果我們在Son類中直接使用name,默認使用的是Son自己的變量;如果我們想使用Father類中的name變量,則可以通過“super.屬性”的形式進行。執(zhí)行結(jié)果如下圖所示:

6. 方法隱藏

在子類繼承父類時,既然存在變量隱藏的現(xiàn)象,同理也存在方法隱藏的現(xiàn)象。

6.1 概念

我們知道,方法的重寫是子類覆蓋父類的對象方法,而方法隱藏則是子類覆蓋父類的 靜態(tài)方法(類方法) 。在java中的靜態(tài)方法能被子類繼承嗎?答案是肯定的,但若子類中有與父類中同名同參的方法,則父類的方法將被隱藏。

6.2 案例實現(xiàn)

我們先定義一個Father父類,里面有個靜態(tài)方法eat。

/**
 * @author 一一哥Sun 
 * 
 * 定義父類
 */
public class Father {
    // 吃---靜態(tài)方法
    public static void eat() {
	System.out.println("爹吃饅頭");
    }
}

然后再定義一個Son子類,里面也有一個靜態(tài)方法eat。我們知道,靜態(tài)方法是可以被繼承的,所以如果Son子類中沒有定義自己的eat()方法,默認可以使用Father父類中的eat()方法。但如果我們在子類中也定義了一個eat()方法,子類的同名靜態(tài)方法就會隱藏父類中的eat()方法,這就是方法隱藏。

/**
 * @author 一一哥Sun 
 * 
 * 子類繼承父類
 */
public class Son extends Father {
    // 吃---靜態(tài)方法
    //如果子類中沒有定義該方法,則子類可以繼承使用父類的eat()方法
    public static void eat() {
	//子類覆蓋父類中的同名靜態(tài)方法(類)
	System.out.println("兒子吃肉");
    }
	
    public static void main(String[] args) {
	//調(diào)用子類自己的靜態(tài)方法
	eat();
		
	//調(diào)用父類的靜態(tài)方法
	Father.eat();
    }
}

執(zhí)行結(jié)果如下圖所示:

6.3 小結(jié)

通過本案例,我們可以得出以下結(jié)論:

子類可以繼承父類中的靜態(tài)方法;

子類無法重寫父類中的靜態(tài)方法,但可以重載;

若子類中定義了與父類中同樣的靜態(tài)方法,則父類的同名方法會被子類隱藏。

二. 重寫與重載的區(qū)別

在Java中既有方法重寫(Override),也有方法重載(Overload),對于初學(xué)者來說很容易搞混。所以有不少面試官,在招聘初級程序員時,就很喜歡問我們方法重寫與方法重載的區(qū)別。

其實方法重寫Override和方法重載Overload的最大不同,在于方法簽名的不同。如果同一個類中的多個方法簽名不同,就是方法重載Overload,重載出的方法是一個新方法。如果父子類之間的多個方法簽名相同,且返回值也相同,就是方法重寫Override。

當(dāng)然,如果你想把關(guān)于重寫和重載的區(qū)別說得更詳細,可以參考以下章節(jié)。

1. 重載的特點

  • 方法重載要求方法同名不同參(參數(shù)類型、個數(shù)、順序);
  • 重載的方法與返回值、訪問修飾符無關(guān);
  • 重載的方法發(fā)生在同一個類中,是在一個類中創(chuàng)建多個同名的方法。

2. 重寫的特點

  • 重寫的方法發(fā)生在父子類中,需要有繼承關(guān)系;
  • 父類的成員方法只能被它的子類重寫,即不能繼承一個方法,就不能重寫這個方法;
  • 被final修飾的方法不能被重寫;
  • 被static修飾的方法不能被重寫,但可以再次聲明;
  • 構(gòu)造方法不能被重寫;
  • 子類和父類在同一個包中時,子類可以重寫父類中除了被private和final修飾的其他所有方法;
  • 子類和父類不在同一個包中時,子類只能重寫父類被public和protected修飾的非final方法;
  • 方法重寫時可以使用@Override注解;
  • 方法簽名要相同;
  • 返回值類型一致
  • 訪問修飾符要更寬泛;
  • 聲明的異常類型要一致

三. 結(jié)語

現(xiàn)在你知道方法重寫是怎么回事了嗎?另外方法重載和方法重寫的區(qū)別,是我們面試初級程序員時很常見的題目,大家一定要牢牢掌握哦?,F(xiàn)在有了方法重寫的基礎(chǔ),接下來我們就可以學(xué)習(xí)多態(tài)的內(nèi)容了,敬請關(guān)注下一篇文章哦。

以上就是一文帶你搞懂Java中方法重寫與方法重載的區(qū)別的詳細內(nèi)容,更多關(guān)于Java 方法重寫與方法重載的區(qū)別的資料請關(guān)注腳本之家其它相關(guān)文章!

相關(guān)文章

  • SpringBoot中注冊Bean的方式總結(jié)

    SpringBoot中注冊Bean的方式總結(jié)

    這篇文章主要介紹了SpringBoot中注冊Bean的方式總結(jié),@ComponentScan + @Componet相關(guān)注解,@Bean,@Import和spring.factories這四種方式,文中代碼示例給大家介紹的非常詳細,需要的朋友可以參考下
    2024-04-04
  • 詳解Java正則表達式中Pattern類和Matcher類

    詳解Java正則表達式中Pattern類和Matcher類

    java.util.regex是一個用正則表達式所訂制的模式來對字符串進行匹配工作的類庫包。包括兩個類Pattern和Matcher Pattern,Pattern是一個正則表達式經(jīng)編譯后的表現(xiàn)模式。Matcher對象是一個狀態(tài)機器,它依據(jù)Pattern對象做為匹配模式對字符串展開匹配檢查。
    2016-12-12
  • Java中BitMap(位圖)hutool版、IntMap、LongMap示例詳解

    Java中BitMap(位圖)hutool版、IntMap、LongMap示例詳解

    這篇文章主要給大家介紹了關(guān)于Java中BitMap(位圖)hutool版、IntMap、LongMap的相關(guān)資料,通過位運算高效存儲和檢索整數(shù),相比于傳統(tǒng)數(shù)組,它們在內(nèi)存占用和性能上都有顯著優(yōu)勢,需要的朋友可以參考下
    2024-12-12
  • spring boot 中設(shè)置默認網(wǎng)頁的方法

    spring boot 中設(shè)置默認網(wǎng)頁的方法

    這篇文章主要介紹了spring boot 中設(shè)置默認網(wǎng)頁的方法,小編覺得挺不錯的,現(xiàn)在分享給大家,也給大家做個參考。一起跟隨小編過來看看吧
    2018-04-04
  • 超詳細的Intellij IDEA 看源碼必備技能

    超詳細的Intellij IDEA 看源碼必備技能

    這篇文章主要介紹了Intellij IDEA 看源碼必備技能,本文通過圖文并茂的形式給大家介紹的非常詳細,對大家的學(xué)習(xí)或工作具有一定的參考借鑒價值,需要的朋友可以參考下
    2020-04-04
  • java設(shè)計模式之簡單工廠模式

    java設(shè)計模式之簡單工廠模式

    這篇文章主要為大家詳細介紹了java設(shè)計模式之簡單工廠模式,具有一定的參考價值,感興趣的小伙伴們可以參考一下
    2016-12-12
  • 總結(jié)Java常用的時間相關(guān)轉(zhuǎn)化

    總結(jié)Java常用的時間相關(guān)轉(zhuǎn)化

    今天給大家?guī)淼氖顷P(guān)于Java的相關(guān)知識,文章圍繞著Java常用的時間相關(guān)轉(zhuǎn)化展開,文中有非常詳細的介紹及代碼示例,需要的朋友可以參考下
    2021-06-06
  • 聊聊Spring?Cloud?Gateway過濾器精確控制異常返回問題

    聊聊Spring?Cloud?Gateway過濾器精確控制異常返回問題

    這篇文章主要介紹了Spring?Cloud?Gateway過濾器精確控制異常返回問題,本篇任務(wù)就是分析上述現(xiàn)象的原因,通過閱讀源碼搞清楚返回碼和響應(yīng)body生成的具體邏輯,需要的朋友可以參考下
    2021-11-11
  • java如何完成輸出語句實例詳解

    java如何完成輸出語句實例詳解

    輸入輸出可以說是計算機的基本功能,下面這篇文章主要給大家介紹了關(guān)于java如何完成輸出語句的相關(guān)資料,文中通過實例代碼介紹的非常詳細,需要的朋友可以參考下
    2023-01-01
  • IDEA2020.1個性化設(shè)置的實現(xiàn)

    IDEA2020.1個性化設(shè)置的實現(xiàn)

    這篇文章主要介紹了IDEA2020.1個性化設(shè)置的實現(xiàn),文中通過示例代碼介紹的非常詳細,對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧
    2020-08-08

最新評論

尼木县| 扬州市| 平果县| 浪卡子县| 山丹县| 泸州市| 嵩明县| 南城县| 体育| 澳门| 黑山县| 小金县| 博乐市| 湾仔区| 逊克县| 泰安市| 瑞安市| 汉寿县| 德兴市| 凤城市| 酒泉市| 古浪县| 彭水| 故城县| 伊春市| 凌海市| 雅江县| 嵊泗县| 稻城县| 阿巴嘎旗| 铜川市| 麻栗坡县| 临颍县| 井冈山市| 塔城市| 钟祥市| 嘉禾县| 滨海县| 南溪县| 新乡县| 桐城市|