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.數據存儲位置不一樣:
成員變量數據存儲在堆內存的對象中,因此也叫對象的特有數據。
靜態變量數據存儲在方法區(共享數據區)的靜態區,因此也叫對象的共享數據。jvm
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.靜態函數。
函數是否用靜態修飾,就參考一點,就是該函數功能是否有訪問到對象中特有的數據。
簡單來講,從源代碼看,該功能是否須要訪問非靜態的成員變量,若是須要,該功能就是非靜態的。若是不須要,就能夠將該功能定義成靜態的。固然,也能夠定義成非靜態,可是非靜態須要被對象調用,而僅建立對象是沒有意義的。this
靜態代碼塊:
隨着類的調用或建立實例而執行,並且只執行一次。
做用:
用於給類進行初始化。spa
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){code
}
public:由於權限必須是最大的。
static:jvm在調用時是不須要對象的,直接用主函數所屬的類名調用便可。
void:主函數沒有具體的返回值 。
main:函數名,不是關鍵字,只是一個jvm識別的固定名字。
String[] args:這是主函數的參數列表,是一個數組類型的參數,並且袁術都是字符串類型。
對象