小編給大家分享一下Java中重寫和覆蓋怎么用,相信大部分人都還不怎么了解,因此分享這篇文章給大家參考一下,希望大家閱讀完這篇文章后大有收獲,下面讓我們一起去了解一下吧!
創(chuàng)新互聯(lián)是專業(yè)的隆昌網(wǎng)站建設(shè)公司,隆昌接單;提供做網(wǎng)站、成都網(wǎng)站建設(shè),網(wǎng)頁設(shè)計,網(wǎng)站設(shè)計,建網(wǎng)站,PHP網(wǎng)站建設(shè)等專業(yè)做網(wǎng)站服務(wù);采用PHP框架,可快速的進(jìn)行隆昌網(wǎng)站開發(fā)網(wǎng)頁制作和功能擴展;專業(yè)做搜索引擎喜愛的網(wǎng)站,專業(yè)的做網(wǎng)站團隊,希望更多企業(yè)前來合作!
關(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é)果,畢竟我們要達(dá)到“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)注創(chuàng)新互聯(lián)行業(yè)資訊頻道!
網(wǎng)站標(biāo)題:Java中重寫和覆蓋怎么用
網(wǎng)址分享:http://vcdvsql.cn/article42/poddhc.html
成都網(wǎng)站建設(shè)公司_創(chuàng)新互聯(lián),為您提供網(wǎng)站內(nèi)鏈、Google、網(wǎng)站建設(shè)、App設(shè)計、網(wǎng)站策劃、網(wǎng)站排名
聲明:本網(wǎng)站發(fā)布的內(nèi)容(圖片、視頻和文字)以用戶投稿、用戶轉(zhuǎn)載內(nèi)容為主,如果涉及侵權(quán)請盡快告知,我們將會在第一時間刪除。文章觀點不代表本網(wǎng)站立場,如需處理請聯(lián)系客服。電話:028-86922220;郵箱:631063699@qq.com。內(nèi)容未經(jīng)允許不得轉(zhuǎn)載,或轉(zhuǎn)載時需注明來源: 創(chuàng)新互聯(lián)