static關鍵字 通常來說,創建類的時候,是用new創建此類的對象才可以獲得,執行new創建對象時數據存儲空間才被分配,其方法才被外界調用 有兩種情況用new無法解決: 1)只為某特定域分配單一存儲空間,不管創建多少對象 2)希望某個方法不與包含她的類的任何對象實例關聯在一起 static初始化: 無論創建多少個對象,靜態數據都只占用一份存儲區域。static關鍵字不能用于局部變量,只能作用于域。 如果一個域是靜態的基本類型域并且沒有進行初始化,那就會獲得基本類型的標準初值;如果是一個對象的引用,那么默認初始化值是null 類加載順序:先加載static域,而后是非static域 類加載后,類中的static域在之后的new中將不再初始化,而非static域會再次被初始化 static用法: 隨著類的加載而加載,優先于對象出現在內存中,并且不能以任何方式引用this 或super 1.修飾變量。靜態字段 靜態變量的定義規范:一旦被static修飾的變量,變量名稱建議全部大寫 當一個類中某個變量被所有對象共享,那么可以將該變量定義為靜態變量.靜態字段可以直接使用類名調用該方法
1 public class StaticTest01{ 2 public static void main(String[] args){ 3 //PI可以對所有對象共享 4 CArea c1 = new CArea(10); 5 CArea c2 = new CArea(100); 6 double area1 = c1.area(); 7 double area2 = c2.area(); 8 System.out.PRintln("兩個圓的面積分別為:"+area1+"~"+area2); 9 System.out.println("圓周率:"+CArea.PI);10 System.out.println("圓周率:"+c1.PI+"~"+c2.PI);11 }12 }13 class CArea{14 public int r;15 public static double PI = 3.14; //圓周率16 public CArea(){}17 public CArea(int r){18 this.r = r;19 }20 public double area(){21 return PI*r*r;22 }23 }24 /*25 結果:26 314~3140027 3.1428 3.14~3.1429 */ 以上程序,創建了兩個CArea對象,這兩個對象c1,c2共享一個PI,c1.PI和c2.PI值相同一存儲空間,具有相同的值3.14 引用static變量的兩種方式:1)如c1.PI; 2)實用類名直接調用:CArea.PI 總結:static作用于某字段時會改變數據創建的方式:因為static字段對每個類來說,無論這個類創建多少個實例,都只有一份存儲空間(存儲在方法區被所有本類的對象共享),而非靜態字段是對每個對象來說都有一份存儲空間 2.修飾方法 方法一旦被static修飾,就可以直接使用類名調用該方法 一般將工具類的方法(不需要使用成員變量)定義為static,直接通過類名去調用 靜態不能調用非靜態,非靜態可以調用靜態和非靜態
1 public class StaticTest02{ 2 public static void main(String[] args){ 3 double area = CArea.area(10); //通過類名CArea去調用靜態方法area 4 System.out.println("圓的面積:"+area); 5 } 6 } 7 class CArea{ 8 public int a; //非靜態變量 9 public static double PI = 3.14; //圓周率10 public CArea(){}11 public static double area(int r){ //靜態方法12 //a = 10; //錯誤做法。13 return PI*r*r;14 }15 } 以上程序,在靜態方法area中調用非靜態成員變量a是錯誤做法!!!靜態不能調用非靜態 static方法的一個重要用法是不創建任何對象的前提下可以直接調用此方法 3.靜態代碼塊 static{語句;} 隨著類的加載而加載,加載類時直接運行靜態代碼塊 static代碼塊只執行一次:當首次生成這個類的一個對象時,或者首次訪問數據這個類的靜態數據成員時(即便從未生成這個類的對象)
4.修飾類 通常一個普通類不允許被聲明為static的,有一個特殊情況:內部類可以被聲明為static 當一個內部類被聲明為static時,外部類可以直接調用內部類,因為static的內部類是在加載外部類的同時加載的,所以只要實例化外部類后,就能用外部類對象直接調用 靜態內部類,而無需實例化內部類。
新聞熱點
疑難解答