類不需要例項化也能直接用
阿新 • • 發佈:2018-12-13
在我以前的意識中,我們需要用到某個類的時候,需要先例項化這個類,例項化出一個物件,然後在使用這個類裡面的方法和屬性,今天偶然的機會了解到,原來有些類是不需要例項化就可以直接用的——靜態(static)類,同時我們可以直接使用靜態類中的方法和屬性。
類、欄位、屬性、方法等只要是被static修飾後,變為靜態類、靜態欄位、靜態屬性、靜態方法,此時,在其他的類中可以直接呼叫這些欄位,屬性,方法等。
基本知識: static修飾的類成為靜態類,靜態類中只能包含靜態成員(被static修飾的欄位、屬性、方法),不能被例項化,不能被繼承;非靜態中可以包含靜態成員。
演示:
下面我通過例項來掩飾一下: 首先需要建立一個C#控制檯專案。(新建過程省略)
1、需要被例項化的類
如果被呼叫成員為非靜態成員,那麼它所屬的類一定是非靜態類。
namespace _1_被呼叫時必須先例項化的情況
{
class Program
{
static void Main(string[] args)
{
ClassA a = new ClassA ();
a.test();//如果不先例項化classA,無法呼叫test方法。
}
}
}
被呼叫的非靜態類。
using System;
namespace _1_被呼叫時必須先例項化的情況
{
public class ClassA
{
public void test()
{
Console.WriteLine("我是非靜態類ClassA中的方法test。");
Console.ReadKey();
}
}
}
解釋:ClassA類為非靜態類,其中的方法test()也為非靜態方法,所以在main函式中呼叫時需要先例項化ClassA類。
2、不需要例項化的情況
1)被呼叫的成員為非靜態類
namespace _2_被呼叫時不需要例項化的情況_被呼叫類為非靜態類
{
class Program
{
static void Main(string[] args)
{
ClassB.test();
}
}
}
呼叫非靜態類中的靜態方法
using System;
namespace _2_被呼叫時不需要例項化的情況_被呼叫類為非靜態類
{
public class ClassB
{
public static void test()
{
Console.WriteLine("我是非靜態類ClassB中的方法test。");
Console.ReadKey();
}
}
}
ClassB類為非靜態類,但其中的方法test()為非靜態方法,所以在mian函式中呼叫時不例項化ClassB類(而且不能例項化),直接呼叫其成員,語法為“類名.成員”。
2)被呼叫類為靜態類
namespace _3_被呼叫時不需要例項化的情況_被呼叫類為靜態類
{
class Program
{
static void Main(string[] args)
{
ClassC.test();
}
}
}
呼叫靜態類中的靜態方法
using System;
namespace _3_被呼叫時不需要例項化的情況_被呼叫類為靜態類
{
public static class ClassC
{
public static void test()
{
Console.WriteLine("我是非靜態類ClassC中的方法test。");
Console.ReadKey();
}
}
}
ClassC類為靜態類,其中的方法也test()為非靜態方法,所以在main函式中呼叫時不例項化classC類(而且不能例項化),直接呼叫其成員,語法為“類名.成員”。
原因
static修飾的物件具有以下特點: 1.全域性唯一,任何一次的修改都是全域性性的影響 2.只加載一次,優先於非靜態 3.使用方式上不依賴於例項物件。
static 關鍵字的作用就是把類的成員變成類的相關,而不是例項相關,也就是說static修飾的成員是屬於整個類的,而不是屬於某個具體的物件。既然是全域性唯一,那麼就沒有必要在去例項化後再用了。