new和override
?
先看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)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: phpstrtotime()对于31日求
- 下一篇: poj 2728(最小比率生成树)