探秘static 類不需例項化就能用?

2022-01-29 09:53:52 字數 2455 閱讀 9089

一般情況下,需要用到某個類的時候,都必須先例項化這個類,才能對其進行呼叫。在程式設計過程中發現,有些類不用例項化就可以直接拿來使用,使用它的字段、方法等等。這時候,靠的就是static作用。static英文意思為「靜止的,靜態的」,在oop中可以作為修飾符,類、字段、屬性、方法等被static修飾後,變為靜態類、靜態字段、靜態屬性、靜態方法……

static修飾的類成為靜態類,靜態類中只能包含靜態成員(被static修飾的字段、屬性、方法),不能被例項化,不能被繼承;非靜態中可以包含靜態成員。

1、被呼叫時必須先例項化的情況:

被呼叫成員為非靜態成員(此時它所屬的類肯定為非靜態類)。如下小例子:

[csharp]view plain

copy

public class classa      //classa類(非靜態類)      

//建構函式      

public void fun() //classa類中的方法(非靜態方法)      

}      

public class classb     //需要呼叫classa類中方法的classb類      

//建構函式      

public void fun()        

}  說明:classa類為非靜態類,其中的方法fun()也為非靜態方法,所以在classb中呼叫時需要先例項化classa類。

2、被呼叫時不需要例項化的情況:

被呼叫成員為靜態成員(此時它所屬的類為靜態類或非靜態類)。如下小例子:

(1)被呼叫類為非靜態類:

[csharp]view plain

copy

public class classa      //classa類(非靜態類)      

//建構函式      

public static void fun() //classa類中的方法(靜態方法)      

}      

public class classb     //需要呼叫classa類中方法的classb類      

//建構函式      

public void fun()        

}  說明:classa類為非靜態類,但其中的方法fun()為靜態方法,所以在classb中呼叫時不例項化classa類(而且不能例項化),直接呼叫其成員,語法為「類名.成員」。

(2)被呼叫類為靜態類:

[csharp]view plain

copy

public static class classa      //classa類(靜態類)      

//classa類中的方法(靜態方法)      

}      

public class classb     //需要呼叫classa類中方法的classb類      

//建構函式      

public void fun()        

}  說明:classa類為靜態類,其中的方法也fun()為靜態方法,所以在classb中呼叫時不例項化classa類(而且不能例項化),直接呼叫其成員,語法為「類名.成員」。

(1) 用來修飾類或類的成員,這時不需要建立例項就能訪問(而且不能例項化),在被呼叫的時候自動例項化,且在記憶體中產生乙個例項。當含有靜態成員的非靜態類例項化出物件後,這些物件公用這些靜態成員,通過類名或物件名都能訪問它們。

在網上看到兩個有趣的小例子:

人是乙個非靜態類。人有腦子,這是乙個用static修飾的屬性。

這個屬性是針對所有的人,是人的共同特徵。而不是某個特點物件所特有的(比如張三有腦子,李四沒腦子),因為只要是個人,他都有腦子(雖然卡洛斯·羅德里格茲只有半個腦子,還有些人比較腦殘→_→,那也算是有腦子),既然是人類共有的,那麼他就不能被例項化。

另外乙個能被例項化的例子,還是人這個類,人的身高,就是乙個非static的屬性。因為每個人的身高是不同的。比如我身材魁梧,高達1.55公尺,這個1.55公尺是描述我的身高,是跟我這個特定的物件有聯絡的。姚明才2.26公尺,這是姚明這個物件的資料。不管是1.55還是2.26,這都和特定的物件有聯絡,而不是人類所共有的特徵。所以非static的可以被例項化,而static不能被例項化。

(2) 修飾方法內部的靜態變數:

我們的**都是從硬碟載入到記憶體中才能執行的,在記憶體中主要分為三個區域,來存放我們的**,分別是堆、棧和靜態儲存區。堆中存放的是**中的引用型別變數,如類的例項、陣列等;棧中存放的是**中的值型別,如整型、浮點型、布林型等;靜態儲存區中存放靜態變數和全域性變數、常亮。

整個程式執行時,**都是共用靜態儲存區中的靜態變數的,例如定義存款餘額為靜態變數,同乙個銀行卡號,無論你是在銀行取錢、在atm機取錢,還是網銀消費,用的都是這個靜態的餘額。

所以,方法內部的靜態變數,執行完靜態變數值不消失,再次執行此物件的方法時,值仍存在,它不是在堆和棧中分配的,是在靜態區非配的, 這是與區域性變數最大的區別

類內的static例項

之前寫過一篇c 中關於static的用法的文章,裡面對 類內的該類的static例項 的理解有問題,在此做重要更新!include using namespace std class a a int n i n static int pub static a sta 正確,可以在類內定義該類的sta...

類的例項化

類 物件 例項 個人的理解,不確定對錯,歡迎大佬指教 建立乙個物件也就是例項化,抽象類不能例項化,創出的物件不能叫例項。普通的類創出來的物件也可以叫例項。cat c new cat 1.new cat,意思是在堆記憶體中建立乙個cat類的物件 2.的建立物件的同時,呼叫cat類中的構造方法,對剛生成...

ue4 模板類例項化 關於模板類例項化

模板函式在宣告的時候,其實並不存在,函式位址也就無從談起了,而匯出到 動態鏈結庫不能將模板類匯出,因為沒法生成例項 如果把模板類的宣告和定義都放在標頭檔案中。需要用到模板類的時候,只需要包 含該標頭檔案,然後進行例項化。如果模板類的宣告和定義分別放在標頭檔案和原始檔中。當例項化的時候,只包含標頭檔案...