日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

new和override

發布時間:2025/4/16 编程问答 25 豆豆
生活随笔 收集整理的這篇文章主要介紹了 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();

輸出結果是:

A
B
B.Fun()

該結果中,先輸出A,在輸出B,說明初始化的時候,先執行基類,再執行化子類的構造函數

聲明A類型的對象:

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

運行結果:

A
B
B.Fun()

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

?

再來看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();

輸出結果是:

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

聲明A類型的對象:

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

運行結果:

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

?

結論:

1.new聲明的方法,當使用子類的類型來調用的時候,它會運行子類中的函數,當類型是基類的話 ,則使用基類的函數來執行,可以簡單的記憶:

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

PS:只有使用virtual定義基類中的函數,并使用override標記子類的函數,才可以達到多態類----始終調用子類的方法

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

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

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

?

再來一道復雜點的網上看到的面試題:

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);

運行上面語句,執行結果是什么?

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

然后執行Fun1(5),由于運行的是A類型對象的Fun2方法,Fun1自然就是A中的Fun1,運行結果是5

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

然后運行Fun1(5),由于運行的是B類型對象的Fun2方法,此時的Fun1已經被B覆蓋掉了,因此執行的是被覆蓋后的方法,運行結果是6

?

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

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

1

5

1

5

?

轉載于:https://www.cnblogs.com/shandong/archive/2012/08/01/2617610.html

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

總結

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

如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。