static final用來修飾成員變數和成員方法,可簡單理解為「全域常數」!
對於變量,表示一旦給值就不可修改,並且透過類別名稱可以存取。
對於方法,表示不可覆寫,並且可以透過類別名稱直接存取。
有時你希望定義一個類別成員,使它的使用完全獨立於該類別的任何物件。通常情況下,類別成員必須透過它的類別的物件來訪問,但是可以建立這樣一個成員,它能夠被它自己使用,而不必引用特定的實例。在成員的聲明前面加上關鍵字static(靜態的)就能創造這樣的成員。如果一個成員被宣告為static,它就能夠在它的類別的任何物件創建之前被訪問,而不必引用任何物件。你可以將方法和變數都宣告為static。 static 成員最常見的例子是main( ) 。因為在程式開始執行時必須呼叫main() ,所以它被宣告為static。
宣告為static的變數實質上就是全域變數。當宣告一個物件時,並不會產生static變數的拷貝,而是該類別所有的實例變數共用同一個static變數。宣告為static的方法有以下幾個限制:
· 它們只能呼叫其他的static 方法。
· 它們只能存取static資料。
· 它們不能以任何方式引用this 或super(關鍵字super 與繼承有關,在下一章中描述)。
如果你需要透過計算來初始化你的static變量,你可以宣告一個static區塊,Static 區塊只在該類別載入時執行一次。下面的範例顯示的類別有一個static方法,一些static變量,以及一個static 初始化區塊:
class UseStatic { static int a = 3; static int b; static void meth(int x) { System.out.println("x = " + x); System.out.println("a = " + a); System.out.println("b = " + b); } static { System.out.println("Static block initialized."); b = a * 4; } public static void main(String args[]) { meth(42); } }
一旦UseStatic 類別被裝載,所有的static語句被運行。首先,a被設定為3,接著static 塊執行(列印一則訊息),最後,b被初始化為a*4 或12。然後呼叫main(),main() 呼叫meth() ,把值42傳給x。 3個println ( ) 語句引用兩個static變數a和b,以及局部變數x 。
注意:在一個static 方法中引用任何實例變數都是非法的。
下面是該程式的輸出:
Static block initialized. x = 42 a = 3 b = 12
在定義它們的類別的外面,static 方法和變數能獨立於任何物件而被使用。這樣,你只要在類別的名字後面加點號運算子即可。例如,如果你希望從類別外面呼叫一個static方法,你可以使用下面通用的格式:
classname.method( )
這裡,classname 是類別的名字,在該類別中定義static方法。可以看到,這種格式與透過物件參考變數呼叫非static方法的格式類似。一個static變數可以以相同的格式來存取-類別名稱加點號運算子。這就是Java 如何實現全域功能和全域變數的一個控製版本。
下面就是一個例子。在main() 中,static方法callme() 和static 變數b在它們的類別之外被存取。
class StaticDemo { static int a = 42; static int b = 99; static void callme() { System.out.println("a = " + a); } } class StaticByName { public static void main(String args[]) { StaticDemo.callme(); System.out.println("b = " + StaticDemo.b); } }
下面是該程式的輸出:
a = 42 b = 99
static成員是不能被其所在class建立的實例存取的。
如果不加static修飾的成員是物件成員,也就是歸每個物件所有的。
加static修飾的成員是類別成員,就是可以由一個類別直接調用,為所有物件共有的。
以上是Java中static和final一起使用實現什麼效果的詳細內容。更多資訊請關注PHP中文網其他相關文章!