sealed-密封的(了解)
1)密封類:使用sealed關鍵字進行修飾,使該類變為密封類,作用是禁止子類繼承
如String類,在.net中本身就對字元串有很多特殊的處理(為String類開了很多“綠燈”,有很多的特權,如:不可變性,字元串池等)作用:不想它本身擁有的特權被别的類繼承,防止造成混亂(即密封類的應用場景)
密封類的文法格式
public sealed class MyClass
{
//類成員
}
注意事項:
1)因為密封類不能被繼承,是以自身不能作為父類,也不能定義為抽象類,但是它可以繼承别的類,實作接口
2)此類中也不能定義虛方法與抽象方法,因為這類方法需要子類進行重新
密封類不能被繼承
//相當于HeNan類的爺爺類
public class Person
{
public string Name { get; set; }
public int Age { get; set; }
}
//密封類
//可以繼承其他的類,但不能被繼承
public sealed class Chinese : Person
{
public void RaedDatabase()
{
Console.WriteLine("隻有本類有讀取資料庫的權限");
}
}
//報錯:Chinese類不能被繼承
public class HeNan : Chinese
{
//不能繼承Chinese類,無法繼續擁有讀取資料庫的權限
}
2)密封方法:被sealed修飾的方法,作用:禁止子類重寫父類的方法
密封方法的文法格式
public sealed override void SayHi()
{
Console.WriteLine("可以重寫父類的虛方法,子類不能繼續重寫");
}
注意事項:
1)在使用sealed關鍵字時,不能同時使用abstract或virtual關鍵字
2)密封方法隻有在覆寫父類的方法時才能使用sealed關鍵字(與override共用)
3)密碼方法不能被子類重寫,但可以進行重載
不允許再次重寫
public class Person
{
//虛方法
public virtual void SayHi()
{
Console.WriteLine("Person類中的虛方法");
}
}
public class Chinese : Person
{
//自己可以重寫,但是不想被子類進行重寫
//與密封類作用類似,自己擁有重寫這個方法的"特權"
//不想子類也擁有此"特權",到此為止
public sealed override void SayHi()
{
Console.WriteLine("可以重寫父類的虛方法,子類不能繼續重寫");
}
//方法可以重載
public void SayHi(string name)
{
Console.WriteLine("可以進行重載");
}
}
public class HeNan : Chinese
{
//報錯:不能再次進行重寫
public override void SayHi()
{
Console.WriteLine("無法再次重寫父類Chinese的虛方法");
}
}
static-靜态的(重點)
C#中的類分為靜态類與非靜态類(沒有被static修飾的類)差別
靜态類:使用的時候不需要執行個體化,第一次調用類的時候會自己進行執行個體化,隻能包含靜态成員
非靜态類:使用的時候需要使用new關鍵字進行執行個體化,可以包含執行個體成員(沒有使用static進行修飾的)與靜态成員
1)靜态類:被static進行修飾的類(一般都用作工具類,裡面大都是一些工具方法)
靜态類的本質是abstract+sealed(即抽象的密封類,了解即可)如Console,Math,Convert等類,裡面幾乎都是方法,作用:不用執行個體化便于調用
//靜态類文法格式
public static class StaticClass
{
//靜态成員
}
注意事項:
1)不能被執行個體化(因為是抽象的,也沒有執行個體成員),不能被繼承(因為是密封的)
2)隻能包含靜态成員(如字段,屬性,方法,構造方法等),不能包含執行個體成員
3)構造方法隻會執行一次;調用成員時直接類名.成員名;不能聲明靜态類的變量
靜态類的特點:
1)全局唯一,全局共享,是以任何一次的修改都會影響全局
2.隻加載一次,優于非靜态,其在記憶體存在的時間(專有名詞:生命周期,如類是類的生命周期,字段是字段的生命周期,以此類推)是這個程式運作時間;非靜态類:使用完後會被GC(垃圾回收機制)進行回收釋放所占記憶體(不是用過馬上回收,後面再說其回收機制)
什麼時候使用靜态類:就看這個類是否需要執行個體化或是否需要被繼承,如果不需要就定義為靜态類
public static class StaticClass
{
//靜态成員被static修飾
public static string name;//字段
public static int Age { get; set; }//屬性
public static void SayHi()
{
Console.WriteLine("靜态方法");
}
//不能定義執行個體成員
//public int num;//執行個體字段
}
//調用靜态類的成員
static void Main(string[] args)
{
Console.WriteLine(StaticClass.name);
Console.WriteLine(StaticClass.Age);
StaticClass.SayHi();
//不能聲明靜态類的變量,因為沒有對象指向它
//StaticClass stClass;//靜态類型的變量
Console.ReadKey();//設定了斷點
}
調用靜态成員的方式
靜态構造方法:靜态類的構造方法,不能有修飾符;不能有執行個體構造方法
隻能有靜态構造方法
public static class StaticClass
{
//不能有參數
public static StaticClass(string name)
{ }
//不能有執行個體構造方法
public StaticClass() { }
//靜态類中正确的構造方法
//不能有修飾符,不能有參數與重載
static StaticClass()
{
Console.WriteLine("隻會執行一次");
}
}
注意:構造方法沒有修飾符與參數,是以也沒有構造方法的重載(根據重載的定義)
靜态成員:包括字段,屬性,方法等,靜态成員可以包含在靜态類中,也可以包含在非靜态類中
當在非靜态類時:1)其類會含有執行個體與靜态兩種構造方法(可反編譯檢視) 2)其靜态成員屬于類(類名.靜态成員名),不屬于類的對象(執行個體成員屬于對象,通過對象名.執行個體成員名)
3)在非靜态類中添加靜态成員,系統自動添加一個靜态的構造方法
非靜态類的靜态構造方法與非靜态構造方法
//非靜态類
public class Person
{
//執行個體構造方法
public Person()
{
Console.WriteLine("執行個體構造方法");
}
//靜态構造方法
static Person()
{
Console.WriteLine("靜态構造方法,隻會執行一次");
}
public static int Age { get; set; }//靜态屬性
public string Name { get; set; }//執行個體屬性
//執行個體方法
public void SayHi()
{
Console.WriteLine("靜态方法");
}
}
//執行個體化對象
static void Main(string[] args)
{
Person p1 = new Person();
Person p2 = new Person();
//new的三個作用之一:調用對象的構造方法
//調用時先調用靜态構造方法,後調用執行個體構造方法
//靜态構造方法隻調用一次,執行個體構造方法可以調用多次
}
注意:由于靜态成員隻會在整個程式退出時,才釋放資源,是以盡量避免寫靜态字段或靜态屬性,最好隻寫靜态方法
在非靜态類時什麼時候使用靜态成員:因為多個對象會共享同一個靜态成員(隻會建立一次,是以隻有一份)是以可定義為靜态成員(減少輸入量)執行個體成員每次建立對象都會建立一份
使用靜态成員
//非靜态類使用靜态成員
public class User
{
//靜态成員,直接指派,所有對象共有
public static string Nationality = "中華人民共和國";
//執行個體成員
public string UName { get; set; }
public int Age { get; set; }
public User(string name, int age)
{
this.UName = name;
this.Age = age;
}
public void SayHi()
{
Console.WriteLine("愛國教授 {0}\t 今年 {1}\t 國籍是 {2}", UName, Age, Nationality);
}
}
//執行個體化對象,調用對象的方法
static void Main(string[] args)
{
//也可以在此為靜态成員指派,看需求
//User.Nationality="中華人民共和國";
//執行個體化對象,隻需為執行個體成員指派即可
User user1 = new User("王樹國", 64);
user1.SayHi();
Console.WriteLine("");
User user2 = new User("鄭強", 62);
user2.SayHi();
Console.WriteLine("");
User user3 = new User("徐文兵", 57);
user3.SayHi();
Console.ReadKey();
}
靜态類與成員在記憶體中會有單獨存儲區域(有一個專門的靜态存儲區)