您好,登錄后才能下訂單哦!
小編給大家分享一下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)了一處警告
那么在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è)資訊頻道!
免責(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)容。