C# 類中的靜態欄位始終繼承自基類
阿新 • • 發佈:2018-11-12
我們試想一下現在有一個類Parent,它有一個static的int型別欄位number,然後如果類Parent有三個子類Child01、Child02和Child03,那麼改變Parent.number的值的話,Child01.number、Child02.number和Child03.number的值也會被更改嗎?
新建一個.NET Core的控制檯專案,我麼來看看如下程式碼:
using System; namespace ConsoleApp { /// <summary> /// 父類 /// </summary> classParent { public static int number = 0; } /// <summary> /// Child01繼承父類Parent /// </summary> class Child01 : Parent { } /// <summary> /// Child02繼承父類Parent /// </summary> class Child02 : Parent { } /// <summary>/// Child03繼承父類Parent /// </summary> class Child03 : Parent { } class Program { static void Main(string[] args) { Parent.number = 1; Child01.number = 100; Child02.number = 200; Child03.number = 300; Console.WriteLine("Parent.number:" + Parent.number.ToString()); Console.WriteLine("Child01.number:" + Child01.number.ToString()); Console.WriteLine("Child02.number:" + Child02.number.ToString()); Console.WriteLine("Child03.number:" + Child03.number.ToString()); Console.WriteLine("Press any key to quite..."); Console.ReadKey(); } } }
結果如下:
很明顯類Parent、Child01、Child02、Child03的number變數實際上都是指向的記憶體中堆的相同地址,也就是說類Child01、Child02和Child03在繼承Parent類後,並不是在記憶體中新建了三個變數Child01.number、Child02.number和Child03.number,而是使用的同一個Parent.number變數。
然後現在我們將程式碼改成如下:
using System; namespace ConsoleApp { /// <summary> /// 父類 /// </summary> class Parent { public static int number = 0; } /// <summary> /// Child01繼承父類Parent,並定義自己的number變數,隱藏父類Parent的number變數 /// </summary> class Child01 : Parent { public static new int number = 0; } /// <summary> /// Child02繼承父類Parent,並定義自己的number變數,隱藏父類Parent的number變數 /// </summary> class Child02 : Parent { public static new int number = 0; } /// <summary> /// Child03繼承父類Parent,並定義自己的number變數,隱藏父類Parent的number變數 /// </summary> class Child03 : Parent { public static new int number = 0; } class Program { static void Main(string[] args) { Parent.number = 1; Child01.number = 100; Child02.number = 200; Child03.number = 300; Console.WriteLine("Parent.number:" + Parent.number.ToString()); Console.WriteLine("Child01.number:" + Child01.number.ToString()); Console.WriteLine("Child02.number:" + Child02.number.ToString()); Console.WriteLine("Child03.number:" + Child03.number.ToString()); Console.WriteLine("Press any key to quite..."); Console.ReadKey(); } } }
現在我們在子類Child01、Child02和Child03中分別定義了自己的number變數,並用關鍵字new隱藏了父類Parent的number變數,我們來看看現在執行的結果:
很明顯,由於子類Child01、Child02和Child03中都有了各自的number變數,現在相當於這三個子類在記憶體中新建了三個變數Child01.number、Child02.number和Child03.number,所以現在每個類中number變數都擁有了不同的值。
所以請記住C#類中子類繼承父類後,其和父類使用的是相同的靜態欄位,子類並不會和父類在記憶體中使用不同的靜態欄位。