1. 程式人生 > >類不需要例項化也能直接用

類不需要例項化也能直接用

  在我以前的意識中,我們需要用到某個類的時候,需要先例項化這個類,例項化出一個物件,然後在使用這個類裡面的方法和屬性,今天偶然的機會了解到,原來有些類是不需要例項化就可以直接用的——靜態(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修飾的成員是屬於整個類的,而不是屬於某個具體的物件。既然是全域性唯一,那麼就沒有必要在去例項化後再用了。