static關鍵字:
特點:
1.static是一個修飾符,用於修飾成員。(成員變量,成員函數)static修飾的成員變量 稱之為靜態變量或類變量。
2.static修飾的成員被所有的對象共享。
3.static優先於對象存在,因為static的成員隨着類的加載就已經存在。
4.static修飾的成員多了一種調用方式,可以直接被類名所調用,(類名.靜態成員)。
5.static修飾的數據是共享數據,對象中的存儲的是特有的數據。
1 private static int age;//用static修飾的成員變量靜態變量或者叫做類變量 2 private String name; //成員變量 3 public static void show(){//靜態函數 可直接用類來調用 4 System.out.println("showStatic"); 5 } 6 public void showDemo(){//成員函數 需要創建對象才可以調用 7 System.out.println("showDemo"); 8 }
成員變量和靜態變量的區別:
1.生命周期的不同:
成員變量隨着對象的創建而存在隨着對象的回收而釋放。
靜態變量隨着類的加載而存在隨着類的消失而消失。
2.調用方式不同:
成員變量只能被對象調用。
靜態變量可以被對象調用,也可以用類名調用。(推薦用類名調用)
3.別名不同:
成員變量也稱為實例變量。
靜態變量稱為類變量。
4.數據存儲位置不同:
成員變量數據存儲在堆內存的對象中,所以也叫對象的特有數據。
靜態變量數據存儲在方法區(共享數據區)的靜態區,所以也叫對象的共享數據。
1 public class Demo { 2 private static int age;//用static修飾的成員變量靜態變量或者叫做類變量 3 private String name; //成員變量 4 public static void show(){//靜態函數 可直接用類來調用 5 System.out.println("showStatic"); 6 } 7 public void showDemo(){//成員函數 需要創建對象才可以調用 8 System.out.println("showDemo"); 9 } 10 11 public static void main(String[] args) { 12 Demo.age = 1;//靜態變量可以直接用類名調用。隨着類加載而存在類的消失而消失 13 Demo d = new Demo(); 14 d.age = 10;//靜態變量也可以通過對象來調用(推薦用類名來調用) 15 d.name="張三";//成員變量只能通過對象來調用。隨着對象創建而存在隨着對象回收而釋放。 16 Demo.show();//靜態方法也可以直接用類名調用。 17 d.show(); //靜態方法也可以通過對象來調用。 18 d.showDemo();//非靜態方法只能通過對象來調用。 19 } 20 }
靜態使用時需要注意的事項:
1.靜態方法只能訪問靜態成員。(非靜態既可以訪問靜態,又可以訪問非靜態)
2.靜態方法中不可以使用this或者super關鍵字。
3.主函數是靜態的。
1 public class Demo { 2 private static int age;//用static修飾的成員變量靜態變量或者叫做類變量 3 private String name; //成員變量也叫做實例變量 4 5 public static void show(){//靜態函數 6 Demo d = new Demo();//因為靜態先於對象加載如果需要訪問必須要創建對象才能訪問 7 d.name = "張三";//靜態方法不能直接訪問非靜態的成員變量 8 d.showDemo();//靜態方法不能直接訪問非靜態的成員函數 9 System.out.println(d.name); 10 } 11 public void showDemo(){//成員函數 12 age = 10;//可以直接訪問靜態變量 13 show();//也可以直接訪問靜態函數 14 System.out.println(age); 15 } 16 }
什么時候使用static來修飾
1.靜態變量:
當分析對象中所具備的成員變量的值都是相同的。這時這個成員就可以被靜態修飾。
只要是數據在對象中都是不同的,就是對象的特有數據,必須存儲在對象中,是非靜態的。
如果是相同的數據,對象不需要做修改,只需要使用即可,不需要存儲在對象中,是靜態的。
2.靜態函數。
函數是否用靜態修飾,就參考一點,就是該函數功能是否有訪問到對象中特有的數據。
簡單來說,從源代碼看,該功能是否需要訪問非靜態的成員變量,如果需要,該功能就是非靜態的。如果不需要,就可以將該功能定義成靜態的。當然,也可以定義成非靜態,但是非靜態需要被對象調用,而僅創建對象是沒有意義的。
靜態代碼塊:
隨着類的調用或創建實例而執行,而且只執行一次。
作用:
用於給類進行初始化。
1 public class Demo {//如果想讓此類成為一個靜態類而類中需要用到一些參數需要初始化就需要靜態代碼塊 2 private static int age; 3 private static String name; 4 //省略get、set方法 5 static{//當類第一次調用或創建實例時給屬性初始化且只執行一次。 6 age = 10; 7 name = "張三"; 8 } 9 public static void showNoen(){//調用此方法age為10name為張三(默認值) 10 System.out.println("年齡:"+age+"姓名:"+name); 11 } 12 public static void show(int age,String name){//調用此方法會覆蓋掉默認值 13 Demo.age = age; 14 Demo.name = name; 15 System.out.println("年齡:"+Demo.age+"姓名:"+Demo.name); 16 } 17 public static void main(String[] args) { 18 Demo.showNoen();//結果為:年齡:10姓名:張三 19 Demo.show(50, "趙四");//結果為:年齡:50姓名:趙四 20 } 21 }
主函數特殊之處:
1.格式固定。
2.被jvm所識別和調用。
public static void main(String[] args){
}
public:因為權限必須是最大的。
static:jvm在調用時是不需要對象的,直接用主函數所屬的類名調用即可。
void:主函數沒有具體的返回值 。
main:函數名,不是關鍵字,只是一個jvm識別的固定名字。
String[] args:這是主函數的參數列表,是一個數組類型的參數,而且袁術都是字符串類型。