天天看點

C# - sealed-密封類與方法,static-靜态類與其靜态成員 085

sealed-密封的(了解)

1)密封類:使用sealed關鍵字進行修飾,使該類變為密封類,作用是禁止子類繼承

如String類,在.net中本身就對字元串有很多特殊的處理(為String類開了很多“綠燈”,有很多的特權,如:不可變性,字元串池等)作用:不想它本身擁有的特權被别的類繼承,防止造成混亂(即密封類的應用場景)

密封類的文法格式

public sealed class MyClass
 {
   //類成員
 }           

注意事項:

1)因為密封類不能被繼承,是以自身不能作為父類,也不能定義為抽象類,但是它可以繼承别的類,實作接口

2)此類中也不能定義虛方法與抽象方法,因為這類方法需要子類進行重新

C# - sealed-密封類與方法,static-靜态類與其靜态成員 085

密封類不能被繼承

//相當于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)密碼方法不能被子類重寫,但可以進行重載

C# - sealed-密封類與方法,static-靜态類與其靜态成員 085

不允許再次重寫

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();//設定了斷點
}           
C# - sealed-密封類與方法,static-靜态類與其靜态成員 085

調用靜态成員的方式

靜态構造方法:靜态類的構造方法,不能有修飾符;不能有執行個體構造方法

C# - sealed-密封類與方法,static-靜态類與其靜态成員 085

隻能有靜态構造方法

public static class StaticClass
{
    //不能有參數
    public static StaticClass(string name)
    { }
  //不能有執行個體構造方法
    public StaticClass() { }
  //靜态類中正确的構造方法
  //不能有修飾符,不能有參數與重載
    static StaticClass() 
    {
     Console.WriteLine("隻會執行一次");
    }
}           

注意:構造方法沒有修飾符與參數,是以也沒有構造方法的重載(根據重載的定義)

靜态成員:包括字段,屬性,方法等,靜态成員可以包含在靜态類中,也可以包含在非靜态類中

當在非靜态類時:1)其類會含有執行個體與靜态兩種構造方法(可反編譯檢視) 2)其靜态成員屬于類(類名.靜态成員名),不屬于類的對象(執行個體成員屬于對象,通過對象名.執行個體成員名)

3)在非靜态類中添加靜态成員,系統自動添加一個靜态的構造方法

C# - sealed-密封類與方法,static-靜态類與其靜态成員 085

非靜态類的靜态構造方法與非靜态構造方法

//非靜态類
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的三個作用之一:調用對象的構造方法
	  //調用時先調用靜态構造方法,後調用執行個體構造方法
   //靜态構造方法隻調用一次,執行個體構造方法可以調用多次
}           

注意:由于靜态成員隻會在整個程式退出時,才釋放資源,是以盡量避免寫靜态字段或靜态屬性,最好隻寫靜态方法

在非靜态類時什麼時候使用靜态成員:因為多個對象會共享同一個靜态成員(隻會建立一次,是以隻有一份)是以可定義為靜态成員(減少輸入量)執行個體成員每次建立對象都會建立一份

C# - sealed-密封類與方法,static-靜态類與其靜态成員 085

使用靜态成員

//非靜态類使用靜态成員
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();
}           

靜态類與成員在記憶體中會有單獨存儲區域(有一個專門的靜态存儲區)