日韩av黄I国产麻豆传媒I国产91av视频在线观看I日韩一区二区三区在线看I美女国产在线I麻豆视频国产在线观看I成人黄色短片

歡迎訪問 生活随笔!

生活随笔

當(dāng)前位置: 首頁 >

new和override

發(fā)布時(shí)間:2025/4/16 34 豆豆
生活随笔 收集整理的這篇文章主要介紹了 new和override 小編覺得挺不錯(cuò)的,現(xiàn)在分享給大家,幫大家做個(gè)參考.

?

先看override的情況:

public class A
{
public A()
{
Console.WriteLine('A');
}
public virtual void Fun()
{
Console.WriteLine("A.Fun()");
}
}

public class B : A
{
public B()
{
Console.WriteLine('B');
}

public override void Fun()
{
Console.WriteLine("B.Fun()");
}
}

聲明B類型的對象:

B test = new B();
test.Fun();

輸出結(jié)果是:

A
B
B.Fun()

該結(jié)果中,先輸出A,在輸出B,說明初始化的時(shí)候,先執(zhí)行基類,再執(zhí)行化子類的構(gòu)造函數(shù)

聲明A類型的對象:

A test = new B();
test.Fun();

運(yùn)行結(jié)果:

A
B
B.Fun()

說明無論是父類型還是子類型的對象 ,當(dāng)使用override時(shí),父類的虛函數(shù)完全被子類的函數(shù)給“覆蓋”了。

?

再來看new的情況:

public class A
{
public A()
{
Console.WriteLine('A');
}
public virtual void Fun()
{
Console.WriteLine("A.Fun()");
}
}

public class B : A
{
public B()
{
Console.WriteLine('B');
}

public new void Fun()
{
Console.WriteLine("B.Fun()");
}
}

?

聲明B類型的對象:

B test = new B();
test.Fun();

輸出結(jié)果是:

A
B
B.Fun() ----此時(shí)與override的效果相同

聲明A類型的對象:

A test = new B();
test.Fun();

運(yùn)行結(jié)果:

A
B
A.Fun() ----此時(shí),與override的情況不一樣了。。。

?

結(jié)論:

1.new聲明的方法,當(dāng)使用子類的類型來調(diào)用的時(shí)候,它會運(yùn)行子類中的函數(shù),當(dāng)類型是基類的話 ,則使用基類的函數(shù)來執(zhí)行,可以簡單的記憶:

override--覆蓋(父類的沒了,始終是兒子)--取決于對象的實(shí)際類型,new--新的(父子共存)--取決于對象的聲明類型。

PS:只有使用virtual定義基類中的函數(shù),并使用override標(biāo)記子類的函數(shù),才可以達(dá)到多態(tài)類----始終調(diào)用子類的方法

2.子類中override父類的方法,父類的方法一定要是virtual,而在子類中new父類的方法,父類的方法不一定要是virtual,virtual和override是多態(tài),new不是多態(tài)

3.抽象類中的抽象方法,必須要被子類override,不能new

4.override可以與sealed關(guān)鍵詞連用: sealed override void F(),而new不行。被sealed修飾過的方法,不能再被子類重寫

?

再來一道復(fù)雜點(diǎn)的網(wǎng)上看到的面試題:

public class A
{
public virtual void Fun1(int i)
{
Console.WriteLine(i);
}

public void Fun2(A a)
{
a.Fun1(1);
Fun1(5);
}
}

public class B : A
{
public override void Fun1(int i)
{
base.Fun1(i + 1);
}
}

?

B b = new B();
A a = new A();
a.Fun2(b);
b.Fun2(a);

運(yùn)行上面語句,執(zhí)行結(jié)果是什么?

先分析a.Fun2(b):傳入的參數(shù)是B類型的,因此a.Fun1(1)執(zhí)行的是B類型對象的Fun1方法,運(yùn)行結(jié)果是2

然后執(zhí)行Fun1(5),由于運(yùn)行的是A類型對象的Fun2方法,Fun1自然就是A中的Fun1,運(yùn)行結(jié)果是5

再分析b.Fun2(a):傳入的參數(shù)是A類型的,因此a.Fun1(1)執(zhí)行的是A類型對象的Fun1方法,運(yùn)行結(jié)果是1

然后運(yùn)行Fun1(5),由于運(yùn)行的是B類型對象的Fun2方法,此時(shí)的Fun1已經(jīng)被B覆蓋掉了,因此執(zhí)行的是被覆蓋后的方法,運(yùn)行結(jié)果是6

?

那么如果把B類中的override改成new,情況會是什么樣呢?

由于public void Fun2(A a)的參數(shù)類型始終是A類型(當(dāng)傳入B類型時(shí),會轉(zhuǎn)成A類型,相當(dāng)于A a =? new B()的效果),而用new不會覆蓋父類的方法,因此結(jié)果是:

1

5

1

5

?

轉(zhuǎn)載于:https://www.cnblogs.com/shandong/archive/2012/08/01/2617610.html

《新程序員》:云原生和全面數(shù)字化實(shí)踐50位技術(shù)專家共同創(chuàng)作,文字、視頻、音頻交互閱讀

總結(jié)

以上是生活随笔為你收集整理的new和override的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網(wǎng)站內(nèi)容還不錯(cuò),歡迎將生活随笔推薦給好友。