由static修飾的變量、常量、和方法被稱為是靜態變量、常量和 方法。
靜態數據和靜態方法的作用通常是為了提供共享數據或方法,如數學計算公式等,以static聲明並且實現,這樣當需要使用時,直接使用類名調用這些靜態成員即可。例如,兩個類在同一個內存區域共享一個數據,在球類使用PI這個常量,另外的圓類也需要使用這個常量,這時沒有必要在兩個類中同時創建PI常量,這樣系統會將這兩個不在同一個類中定義的常量分配到不同的內存空間中,這是聲明靜態成員就好,靜態成員歸類所有,區別於個別對象,可以在本類和其他類使用"類名.靜態名"調用靜態成員。盡管使用這種方式調用靜態成員比較方便,但靜態成員同樣遵循着public、private、protected的約束。
1 public class Stat { 2 static double PI=3.1415926; 3 static int id; 4 public static void method1(){ 5 System.out.println("hello,method1."); 6 } 7 public void method2(){ 8 System.out.println(PI); 9 System.out.println(id); 10 method1(); 11 } 12 }
主類
1 public class Main { 2 3 /** 4 * @param args 5 */ 6 public static void main(String[] args) { 7 // TODO Auto-generated method stub 8 Stat st=new Stat(); 9 st.method2(); 10 } 11 12 }
結果
3.1415926 0 hello,method1.
static是自動初始化滴,為0.
在java語言中對static有一些規定:
1.在靜態方法中不可以使用this關鍵字;
2.在靜態方法中不可以直接調用非靜態方法;
3.規定不得能將方法體內的局部變量聲明為static;
4.可以用static定義一個靜態區域,可以先執行類的初始化動作……具體問題具體分析,說這幾句只是表面……
final關鍵字可以用於變量聲明,一旦變量被設定,就不可以再改變變量的值,通常,由final定義的變量為常量。
final關鍵字定義的變量聲明時必須立即賦值,除了可以修飾基本數據類型的常量,還可以修飾對象引用。由於數組可以被看成一個對象來引用,所以final可以修飾數組。
一旦一個對象引用被修飾為final后,它只能恆定的指向一個對象,無法將其改變指向另一個對象。
一個既是static又是final的字段只占據一段不能改變的存儲空間。
1 import java.util.Random; 2 public class Fina { 3 public static Random rand=new Random(); 4 public final int a1=rand.nextInt(10); 5 public static final int a2=rand.nextInt(10); 6 7 }
主類
1 public class Main { 2 3 /** 4 * @param args 5 */ 6 public static void main(String[] args) { 7 // TODO Auto-generated method stub 8 Fina fi=new Fina(); 9 System.out.println(fi.a1); 10 System.out.println(fi.a2); 11 Fina fii=new Fina(); 12 System.out.println(fii.a1); 13 System.out.println(fii.a2); 14 } 15 16 }
結果
4 5 2 5
定義為final的常量是恆定不變的,將隨機數賦予定義為final的常量,可以做到每次運行程序時改變a1的值,但是a2不同於a1,由於它被聲明為static final形式,所以在內存中為a2開辟了一個恆定不變的區域,當再次實例化一個對象時,仍然指向a2這塊內存區域,所以a2保持不變。a2只是裝載時初始化,而不是每次創建對象時都被初始化,而a1會在重新實例化對象時被更改。