一、不建立對象即想使用的兩種實際情況。
筆者提到的這個問題是否是無中生有呢?其實不然。在實際應用程序開發中,就經常會遇到這種情況。如現在需要三個對象,分別用來計算圓的面積、圓球的體積、圓柱的體積。在這三個對象的方法中,都需要用到一個叫做圓周率的常量,而且這個圓周率是固定不變的。所以,在程序開發中,對於這些公用的成員變量最好能夠統一管理。當調整成員變量的精度時,其運算結果的精度也會隨之調整。從程序員的角度來看,這就是要求在沒有創建對象之前就要給成員變量分配存儲空間,以方便其他的類可以因用這個變量。而這個需求如果沒有Statci關鍵字的話就無法實現。
第二種情況就是程序員可能希望某個方法不予包含它的類的任何對象關聯在一起。這個讀起來可能有點拗口。簡單的說,就是即使沒有使用new關鍵字創建對象的情況下,程序員仍然能夠調用這個方法。也就是說,在創建類的時候就需要為這個方法分配存儲空間。就好像造汽車時,在做汽車設計圖紙時就需要把發動機准備好。那麼即使汽車還沒造好,這個發動起也可以先拿來看看。此時也需要采用Static關鍵字來完成這個需求。
二、Static關鍵字的用途。
簡單的說,Static關鍵字的用途就是在創建類的時候就給特定的成員或者方法分配存儲空間。當程序員在成員變量或者方法前面加上Static 關鍵字時,就表示這些成員與方法不會與包含它的那個類的任何對象實例關聯在一起。換一句話就是說,即使沒有創建這個類的對象,程序員仍然可以調用這個類中的成員或者方法。因為他們實際上已經存在,系統已經為他們分配了存儲空間。不過需要注意的是,Static關鍵字定義的成員與方法,畢竟與傳統的對象創建方法有所差異。所以無論是在定義時還是在具體的引用過程中,都有所差異。程序開發人員必須了解這種差異,並在實際的工作中要引起重視。特別是如果有其他語言開發經驗的程序員,不要將Java語言的這個特性與其他語言搞混,否則的話很容易出現錯誤。
三、利用Static關鍵字來定義成員變量。
如上面那個案例中,需要定義一個類,然後在這個類中需要用到一個叫做圓周率的成員。如果我們將這個成員命名為pi,則這個類可以按照下面的方法定義成員變量。
Class circle{
Static float pi=3.14
}
這個類的定義跟其他類最大的不同,就是在成員變量前面加了一個 static關鍵字。此時就將這個成員變量設置為了staitc狀態。其實在創建這個類的時候,系統就為其分配了一份存儲空間。而不是在創建對象的時候再創建的。也就是說,現在就將這個成員變量跟包含它的類獨立出來。在這種情況下,如果利用new關鍵字來創建對象,那麼這個成員變量都是指向同一個。即程序員如果利用這個類創建三個對象時,其成員變量pi都指向同一個存儲空間。為此不同對象內的成員變量pi的值都是相同的,因為其實際上都指的是同一東西。所以說,要統一多個對象中成員變量的值是非常簡單的。只需要在定義類的時候,在這個成員變量的前面加上關鍵字static即可。那麼該如何引用這個成員變量呢?據筆者所知,現在主要有兩種引用的方法。不過筆者只用其中的一種。第一種方式就是跟傳統的引用方式相同。也就是說,第一步是創建類(根據需要可以在某個成員變量前面利用static關鍵字加以修飾),第二步是創建對象,第三步就是通過對象來引用成員變量。引用的格式就是對象名.成員變量。這種方法就是比較傳統的方法,通過對象去定位成員變量。很明顯,如果采用這種方法的話,在代碼中就不能夠體現這個成員變量到底是 static變量呢,還是非static變量。所以說這會給程序員閱讀代碼帶來麻煩。
第二種方法是直接通過類來調用。也就說可以通過類名.成員變量的形式來加以調用。各位讀者知道為什麼可以以這種形式加以調用呢?這主要是因為,根據這個類創建的對象,只要成員變量采用了關鍵字static修飾,他們他們指向的都是同一個變量。即系統只為他們分配了一份存儲空間。所以只通過類名就可以唯一的關聯到這個靜態的成員變量。而如果沒有利用static關鍵字修飾的成員變量就不行。因為此時根據這個類創建的多個對象,其內部的成員變量是各自獨立的,也就是說每個對象內部的成員變量都有一個對應的存儲位置。所以說,如果一個類有多個對象,那麼就不能夠通過對象直接關聯到變量對應的存儲位置了。系統不知道這個類對應的對象到底是哪個,即存在一對多的情況。而采用了static關鍵字修飾的變量,無論有多少個對象,其都是一對一的關系。所以,可以通過類名.成員變量名的方式來直接引用這個成員變量。
雖然兩種方法都可以實現對static變量的引用。但是筆者建議大家采用第二種方式。並不是說采用第二種方式更加的便捷或者說可以提高應用程序的性能。筆者這麼建議,主要是從代碼的閱讀性上來考慮的。如果采用對象名.成員變量這種形式來引用的話,那麼就不怎麼直觀的反應這個變量的特殊性。而如果采用類名.成員變量的形式來引用的話,那麼成語員就可以一目了然的知道這個成員變量就是靜態變量。這有利於代碼的閱讀與修改。
四、利用Static關鍵字來定義成員方法。
利用Static關鍵字來定義靜態的成員方法,其實跟靜態成員變量的定義類似。只需要在某個方法前面加上關鍵字static即可。不過在內部的實現機制上,兩個還是有差別的。從以上的分析中可以看出,當將某個成員變量定義為靜態變量時,其實內部數據創建的方式得到了改變。因為正常情況下,非靜態成員變量每個對象都有一個存儲空間,也就是說一個類如果有多少個對象則這個成員變量就有多少個存儲空間。而如果成員變量設置為靜態變量時,則一個類中的一個靜態成員變量只有一個存儲空間。即使這個類創建了數百個對象,但是這個對象中的靜態成員變量也只有一個存儲空間。這就是靜態成員變量與非靜態成員變量的主要差異。但是如果將某個方法定義為靜態方法的話,差別就沒有這麼大。這主要是因為方法只涉及到調用,很少涉及到存儲空間的分配。
而至於這個靜態方法的調用,跟靜態變量的調用相同。即可以利用對象名來調用,也可以利用類名來調用。同理,筆者建議是采用類名來調用,這可以強調靜態方法的靜態性。另外需要注意的是,創建靜態方法的一個重要的用途就是在不創建任何對象的情況下,就來調用靜態的方法。此時就只能夠通過類名來調用這個靜態方法。因為對象根本沒有被創建。
所以如果static關鍵字用於修飾成員變量,即把這個變量設置為靜態變量,這主要是用來解決多個對象共享同一個變量的需求。而將某個方法設置為靜態方法,這主要是用來在不創建任何對象的情況下就可以使用某個方法。故靜態變量與靜態方法雖然實現與引用的方式相同,但是兩者解決問題的側重點是不同的。