1、靜態類別和靜態成員有哪些功能特性? 實現代碼?
靜態類別和靜態成員是指使用static關鍵字定義的類別或成員,凡是static類別的成員一定是static成員,不然會報錯的。靜態類別和成員的一大特點就是它們是獨一無二的。如果是static類,那麼它是不能實例化的,而且載入在記憶體中只有一個;如果是static變量,方法,這個類別可以被實例化的話,無論實例化多少次,static變數或方法總是只有一個。
如下:
(1)、靜態成員
public class StatTicMember { public static string testA = string.Empty; } class Program { static void Main(string[] args) { //StaticConstruct strc = new StaticConstruct(); //StaticConstruct strcValue = new StaticConstruct(string.Empty); StatTicMember sMember1 = new StatTicMember(); StatTicMember.testA = @"静态成员"; Console.WriteLine(StatTicMember.testA); StatTicMember sMember2 = new StatTicMember(); Console.WriteLine(StatTicMember.testA); Console.ReadLine(); } }
結果:
靜態成員特徵:
a、必須透過類別名稱引用,不能用次類別的物件來引用,在記憶體中只有同一塊區域;
c、靜態方法中如果引用方法外的變數或方法,它們也必須是靜態的,如
public class StatTicMember { public static string testA = string.Empty; public string testB = string.Empty; public static void Method() { testA = @"my";//正确 //testB = @"my";//错误 } }
public static class StaticClass { public static string testA = string.Empty; public static void StaticMethod() { Console.WriteLine(@"静态方法"); } } class Program { static void Main(string[] args) { StaticClass.testA = @"静态类"; Console.WriteLine(StaticClass.testA); StaticClass.StaticMethod(); Console.ReadLine(); } }
類別特性:
a、成員必須也是靜態的;
b、不能別實例化,引用內部成員直接用類別名稱;
c、是密封類別;(註:密封類別是指這個類別不能用作基底類別,不能是抽象類,也就是不能派生。
靜態類別和成員使用場合,靜態類別不能氾濫使用,因為它一旦載入了,就在記憶體中有一塊區域,不論你用或不用,它都在那裡。佔用了記憶體。如下場合可以使用:
a、全局的變量,整個工程中都用到的一個變量,而且值不輕易改變,即使改變所有模組都必須要做出反應。
b、不操作實例數據,不與程式碼中特定類別關聯的方法,例如Math類別中的一些方法。
2、密封類功能特性? 實現代碼? 為什麼要使用密封類別?
密封類別是指用sealed關鍵字修飾的一種類,它的目的是防止派生,也就是這種類別不能被繼承。
特點:不能用作基類,不能抽象,密封類的呼叫比較快。
public sealed class SealedClass { public string testA = string.Empty; }
抽象類別是指用abstract關鍵字修飾的類別。作用是衍生多個類,共享基類的公用方法和屬性。 抽象類別與介面的差異: a、類別是物件的抽象,可以將抽象類別理解為將類別當作對象,抽象化的類別叫做抽象類別。而介面只是一個行為的規範或規定,微軟的自訂介面總是後帶able字段,證明其是表述一類類「我能做...」.抽象類別更多的是定義在一系列緊密相關的類別間,而介面大多是關係疏鬆但都實現某一功能的類別中; public abstract class AbstractClass
{
public abstract void CommonMethod();
}
public class ChildClass1 : AbstractClass
{
public override void CommonMethod()
{
Console.WriteLine(@"实现公用方法1");
}
}
public class ChildClass2 : AbstractClass
{
public override void CommonMethod()
{
Console.WriteLine(@"实现公用方法2");
}
}
class Program
{
static void Main(string[] args)
{
ChildClass1 chc1 = new ChildClass1();
chc1.CommonMethod();
ChildClass2 chc2 = new ChildClass2();
chc2.CommonMethod();
Console.ReadLine();
}
}
b、介面基本上不具備繼承的任何特定特性,它僅僅承諾了能夠呼叫的方法;
c、一個類別一次可以實現若干個介面,但是只能擴充一個父類別;
d、介面可以用來支援回呼,而繼承並沒有這個特點;
e、抽象類別不能被密封;
e、抽象類別不能被密封;
預設為虛的,但實現介面的類別中的介面方法卻預設為非虛的,當然也可以宣告為虛的;
g、(介面)與非抽象類別類似,而抽象類別也必須為在該類別中的基類列表中列出的介面的所有成員提供它自己的實作。但是,允許抽象類別將介面方法映射到抽象方法上;
h、抽象類別實現了oop中的一個原則,將可變的與不可變的分離。抽象類別和介面就是定義為不可變的,而把可變的交給子類別去實現;
i、好的介面定義應該是具有專屬功能性的,而不是多功能的,否則造成介面污染。如果一個類別只是實現了這個介面的中一個功能,而不得不去實現介面中的其他方法,就叫接口污染;
j、如果抽象類別實作接口,則可以把介面中方法對應到抽象類別中作為抽象方法而不必實現,而在抽象類別的子類別中實作介面中方法。