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();
}
}
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、必須通過類名引用,不能用類的對象來引用;
b、無論類被實例化多少次,在內存中只有同一塊區域;
c、靜態方法中如果引用方法外的變量或方法,它們也必須是靜態的,如
public class StatTicMember
{
public static string testA = string.Empty;
public string testB = string.Empty;
public static void Method()
{
testA = @"my";//正確
//testB = @"my";//錯誤
}
}
public class StatTicMember
{
public static string testA = string.Empty;
public string testB = string.Empty;
public static void Method()
{
testA = @"my";//正確
//testB = @"my";//錯誤
}
}
(2)、靜態類
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();
}
}
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、是密封類;(注:密封類是指這個類不能用作基類,不能是抽象類,也就是不能派生。)
d、不能包含構造函數。
靜態類和成員使用場合,靜態類不能泛濫使用,因為它一旦加載了,就在內存中有一塊區域,不論你用或不用,它都在那裡。占用了內存。如下場合可以使用:
a、全局的變量,整個工程中都用到的一個變量,而且值不輕易改變,即使改變所有模塊都必須要做出反應。
b、不操作實例數據,不與代碼中特定類關聯的方法,比如Math類中的一些方法。
2、密封類功能特性? 實現代碼? 為什麼要使用密封類?
密封類是指用sealed關鍵字修飾的一種類,它的目的是防止派生,也就是這種類不能被繼承。
特點:
不能用作基類,不能抽象,密封類的調用比較快。
public sealed class SealedClass
{
public string testA = string.Empty;
}
public sealed class SealedClass
{
public string testA = string.Empty;
}
3、什麼是抽象類? 功能特性? 實現代碼? 接口與抽象類的區別?
抽象類是指用abstract關鍵字修飾的類。作用是派生多個類,共享基類的公用方法和屬性。
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();
}
}
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();
}
}
結果:
抽象類和接口的區別:
a、類是對對象的抽象,可以把抽象類理解為把類當作對象,抽象成的類叫做抽象類。而接口只是一個行為的規范或規定,微軟的自定義接口總是後帶able字段,證明其是表述一類類“我能做...”.抽象類更多的是定義在一系列緊密相關的類間,而接口大多數是關系疏松但都實現某一功能的類中;
b、接口基本上不具備繼承的任何具體特點,它僅僅承諾了能夠調用的方法;
c、一個類一次可以實現若干個接口,但是只能擴展一個父類;
d、接口可以用於支持回調,而繼承並不具備這個特點;
e、抽象類不能被密封;
f、抽象類實現的具體方法默認為虛的,但實現接口的類中的接口方法卻默認為非虛的,當然也可以聲明為虛的;
g、(接口)與非抽象類類似,抽象類也必須為在該類的基類列表中列出的接口的所有成員提供它自己的實現。但是,允許抽象類將接口方法映射到抽象方法上;
h、抽象類實現了oop中的一個原則,把可變的與不可變的分離。抽象類和接口就是定義為不可變的,而把可變的交給子類去實現;
i、好的接口定義應該是具有專一功能性的,而不是多功能的,否則造成接口污染。如果一個類只是實現了這個接口的中一個功能,而不得不去實現接口中的其他方法,就叫接口污染;
j、如果抽象類實現接口,則可以把接口中方法映射到抽象類中作為抽象方法而不必實現,而在抽象類的子類中實現接口中方法。
作者 白楊樹