溫馨提示×

溫馨提示×

您好,登錄后才能下訂單哦!

密碼登錄×
登錄注冊×
其他方式登錄
點擊 登錄注冊 即表示同意《億速云用戶服務(wù)條款》

Java中重寫和覆蓋怎么用

發(fā)布時間:2021-12-20 11:40:18 來源:億速云 閱讀:184 作者:小新 欄目:大數(shù)據(jù)

小編給大家分享一下Java中重寫和覆蓋怎么用,相信大部分人都還不怎么了解,因此分享這篇文章給大家參考一下,希望大家閱讀完這篇文章后大有收獲,下面讓我們一起去了解一下吧!

關(guān)于類的重寫和覆蓋,我們很容易把他們搞混淆,在Java中jvm會自動幫我們處理這樣的問題,但是在c#中咱們也有相關(guān)的關(guān)鍵字和處理方式,我們先來研究一下繼承關(guān)系中構(gòu)造函數(shù)和方法的執(zhí)行順序問題。

下面我們來個簡單的代碼

class A{    public A()    {        Console.WriteLine("這是a構(gòu)造函數(shù)");    }    public void a()    {        Console.WriteLine("這是a方法");    }}class B : A{    public B()    {        Console.WriteLine("這是b構(gòu)造函數(shù)");    }    public void b()    {        Console.WriteLine("這是b方法");    }}
class Program{    static void Main(string[] args)    {        Console.WriteLine("創(chuàng)建父級===============================================");        A a = new A();        Console.WriteLine("創(chuàng)建子級===============================================");        B b = new B();        Console.WriteLine("父級開始調(diào)用a方法======================================");        a.a();        Console.WriteLine("子級開始調(diào)用b方法======================================");        b.b();        Console.WriteLine("創(chuàng)建一個像父級的子級===================================");        A a1 = new B();        a1.a();        Console.Read();    }}

輸出如下

創(chuàng)建父級===============================================這是a構(gòu)造函數(shù)創(chuàng)建子級===============================================這是a構(gòu)造函數(shù)這是b構(gòu)造函數(shù)父級開始調(diào)用a方法======================================這是a方法子級開始調(diào)用b方法======================================這是b方法創(chuàng)建一個像父級的子級===================================這是a構(gòu)造函數(shù)這是b構(gòu)造函數(shù)這是a方法

我們可以從上面的返回可以知道,在繼承關(guān)系中,先執(zhí)行父級的構(gòu)造函數(shù),然后是子級構(gòu)造函數(shù),然后再調(diào)用方法。

當(dāng)然這里注意的是,需要一個父類可以給一個子類或者父類實例,但是反過來不可以,這個是我們后面學(xué)的多態(tài),或者可以說是里氏代換原則。

覆蓋  

覆蓋簡單的來說就是子類繼承父類,同時也繼承了不為私有的成員,如果說子類有一個與父類同方法簽名的方法,且沒有被重寫,那么我們在調(diào)用這個方法的時候由于父類的方法優(yōu)先于子類的方法,子類被父類覆蓋。

下面我們來看一段代碼

class A{    public void a()    {        Console.WriteLine("這是父級a方法");    }}class B : A{    public void a()    {        Console.WriteLine("這是子級a方法");    }}
class Program{    static void Main(string[] args)    {        A a = new B();        a.a();        Console.Read();    }}
這是父級a方法

此時我們看到調(diào)用子類的方法時,被父類覆蓋了,調(diào)用了父級的方法。

這里我們值得注意的是編譯器已經(jīng)出現(xiàn)了一處警告

Java中重寫和覆蓋怎么用

那么在c#中,new關(guān)鍵字的另一種用法就是消除覆蓋的警告

class B : A{    public new void a(){        Console.WriteLine("這是子級a方法");    }}

雖然我們加上這個new并沒有改變執(zhí)行結(jié)果,畢竟我們要達到“0 error,0 warning”

那么有些時候,我父級的一個方法就是為了給子類擴展自己這個方法的特別之處,比如鳥類有翅膀,子類的燕子既有翅膀還飛得賊快,子類鴕鳥雖然有翅膀但它不能飛。別人就說所有的鳥都能飛,那么我給一個鴕鳥給他是不是證明了他說的是錯誤的。

只要能用到父級的地方,我們都能夠用他的子類來代替,因為子類包括父類的特征,這個就是我們面向?qū)ο笤瓌t里面的里氏代換原則。有些時候父級的一些方法不能實現(xiàn)我們想要的效果,那么我們就重寫這個父類的這個方法。

重寫  

重寫也是在父子繼承關(guān)系中存在的,重寫父級的方法用關(guān)鍵字virtual標(biāo)記父級的方法,表示這個方法是一個虛方法(有些地方叫虛函數(shù),都差不多),在子級用override重寫父級標(biāo)記的方法,這兩個關(guān)鍵字是一起使用的。如果父級virtual標(biāo)記了但是子級沒有使用override重寫,那是沒有效果的,下面看代碼:

class A{    public virtual void a()    {        Console.WriteLine("這是父級a方法");    }}class B : A{    public override void a()    {        Console.WriteLine("這是重寫父級a方法");    }}class Program{    static void Main(string[] args)    {        A a = new B();        a.a();    }}
這是重寫父級a方法

我們區(qū)分重寫和覆蓋,它真的非常重要,重寫是面向?qū)ο笾幸粋€非常重要的基礎(chǔ)。

總結(jié):

覆蓋:使用父類創(chuàng)建子類,由于父類的方法先執(zhí)行,所有子類的方法被覆蓋,使用關(guān)鍵字new來消除編譯器的警告。

重寫:父類的方法需要用virtual標(biāo)記為虛方法,子類使用override重寫父類的虛方法。使用父類對象創(chuàng)建一個子類對象代替,子類方法重寫父類方法,每個子類都不一樣,我們要靈活使用

以上是“Java中重寫和覆蓋怎么用”這篇文章的所有內(nèi)容,感謝各位的閱讀!相信大家都有了一定的了解,希望分享的內(nèi)容對大家有所幫助,如果還想學(xué)習(xí)更多知識,歡迎關(guān)注億速云行業(yè)資訊頻道!

向AI問一下細節(jié)

免責(zé)聲明:本站發(fā)布的內(nèi)容(圖片、視頻和文字)以原創(chuàng)、轉(zhuǎn)載和分享為主,文章觀點不代表本網(wǎng)站立場,如果涉及侵權(quán)請聯(lián)系站長郵箱:is@yisu.com進行舉報,并提供相關(guān)證據(jù),一經(jīng)查實,將立刻刪除涉嫌侵權(quán)內(nèi)容。

AI