當(dāng)static修飾變量時(shí),它使得該靜態(tài)局部變量只執(zhí)行一次,并延長其生命周期直至程序結(jié)束才釋放。對(duì)于全局變量,使用static修飾時(shí),該變量只能在定義它的文件內(nèi)訪問,無法在其他文件中訪問,即便使用extern聲明也不行。當(dāng)static修飾函數(shù)時(shí),該函數(shù)只能在定義它的文件中被調(diào)用。Static修飾的局部變量存放在全局?jǐn)?shù)據(jù)區(qū)的靜態(tài)變量區(qū)。
進(jìn)一步擴(kuò)展,static關(guān)鍵字在C語言、C++和Java中的使用有相似之處,但也存在差別。例如在C++中,static可以修飾靜態(tài)數(shù)據(jù)成員和靜態(tài)成員函數(shù)。靜態(tài)數(shù)據(jù)成員可以在多個(gè)對(duì)象間共享數(shù)據(jù),它是所有對(duì)象的共享成員,只在程序開始時(shí)分配空間,并在程序結(jié)束時(shí)釋放。靜態(tài)數(shù)據(jù)成員既可以通過對(duì)象名引用,也可以通過類名引用。靜態(tài)成員函數(shù)屬于類的靜態(tài)成員,沒有this指針,主要用于訪問靜態(tài)數(shù)據(jù)成員,不能訪問非靜態(tài)成員。
在Java中,被聲明為static的變量稱為靜態(tài)變量或類變量,可以直接通過類名或?qū)嵗茫ㄗh通過類名引用以避免混淆。同樣,被聲明為static的方法稱為靜態(tài)方法或類方法,可以直接調(diào)用靜態(tài)方法、訪問靜態(tài)變量,但不能直接訪問實(shí)例變量和實(shí)例方法。
static在C++中還有其他含義。當(dāng)修飾全局變量時(shí),表明該變量只對(duì)定義在同一文件中的函數(shù)可見。當(dāng)修飾局部變量時(shí),表明該變量的值在函數(shù)返回后不會(huì)丟失。當(dāng)修飾函數(shù)時(shí),表明該函數(shù)只能在同一文件中調(diào)用。對(duì)于類的數(shù)據(jù)成員,static表明該類所有對(duì)象共享一個(gè)數(shù)據(jù)實(shí)例。
關(guān)于static在C語言中的使用,它還可以表示私有和靜態(tài)的意思。在函數(shù)中聲明為“靜態(tài)變量”時(shí),該變量在函數(shù)返回后不會(huì)立即釋放,保留的值可以在下一次調(diào)用時(shí)繼續(xù)使用。static還可以修飾全局變量和函數(shù),改變它們的可見性。靜態(tài)全局變量的生命周期直到程序或進(jìn)程結(jié)束,靜態(tài)局部變量的生命周期也一樣。
關(guān)于static的使用和作用,它還可以用于聲明類的靜態(tài)成員和靜態(tài)函數(shù)。類的靜態(tài)成員可以實(shí)現(xiàn)多個(gè)對(duì)象之間的數(shù)據(jù)共享,使用靜態(tài)成員不會(huì)破壞封裝性,也保證了安全性。類的靜態(tài)函數(shù)可以在不實(shí)例化的情況下使用,減少資源消耗。
需要注意的是,盡管在某些情況下可以在頭文件中聲明靜態(tài)變量,但這種做法通常不推薦。因?yàn)樵陬^文件中只是變量的聲明而非定義,當(dāng)源文件引用該頭文件時(shí),相當(dāng)于將頭文件的聲明語句拷貝到源文件中進(jìn)行變量的定義。由于static使得變量在定義的文件中是可見的,因此每個(gè)引用靜態(tài)變量頭文件的源文件都有自己獨(dú)立的靜態(tài)變量,雖然變量名相同但不會(huì)產(chǎn)生沖突。編譯器在編譯時(shí),會(huì)為每個(gè)文件中的同名靜態(tài)變量分配不同的地址空間。