我們試想一下現在有一個類Parent,它有一個static的int類型字段number,然后如果類Parent有三個子類Child01、Child02和Child03,那么改變Parent.number的值的話,Child01.number、Child02.number和Child03.number的值也會被更改嗎?
新建一個.NET Core的控制台項目,我么來看看如下代碼:
using System; namespace ConsoleApp { /// <summary> /// 父類 /// </summary> class Parent { 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 quit..."); Console.ReadKey(); } } }
結果如下:
很明顯類Parent、Child01、Child02、Child03的number變量實際上都是指向的內存中棧(stack)的相同地址,也就是說類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 quit..."); Console.ReadKey(); } } }
現在我們在子類Child01、Child02和Child03中分別定義了自己的number變量,並用關鍵字new隱藏了父類Parent的number變量,我們來看看現在運行的結果:
很明顯,由於子類Child01、Child02和Child03中都有了各自的number變量,現在相當於這三個子類在內存中新建了三個變量Child01.number、Child02.number和Child03.number,所以現在每個類中number變量都擁有了不同的值。
所以請記住C#類中子類繼承父類后,其和父類使用的是相同的靜態字段,子類並不會和父類在內存中使用不同的靜態字段。