static關鍵字用處
1.用於修飾成員變量和成員函數
被修飾後的成員具有以下特點:
1.隨著類的加載而加載
2.優先於對象存在
3.被所有對象所共享
4.可以直接被類名調用
使用注意
1.靜態方法只能訪問靜態成員;非靜態方法也可以訪問靜態成員
2.靜態方法中不可以寫this,super關鍵字
主函數是靜態的
實例變量(成員變量)和類變量(靜態變量)的區別
1.生命周期不同
成員變量隨著對象的創建而存在,隨著對象的回收而釋放;
靜態變量隨著類的加載而存在隨著類的消失而消失
2.調用方式不同
成員變量只能被對象調用
靜態變量能被對象調用也能被類名調用(一般建議使用類名調用)
3.別名不同
成員變量也叫實例變量
靜態變量也叫類變量
4.數據的存儲位置不同
成員變量數據存儲在堆內存中的對象中,所以是對象的特有數據
靜態變量數據存儲在方法區(數據區或共享數據區)的靜態區中,所以也叫對象的共享數據
內存圖解
以下代碼在內存中的執行:
class Person{ private String name; private int age; static String country = "CN"; public Person(String name, int age){ this.name = name; this.age = age; } public void show(){ System.out.println(Person.country+":"+this.name+":"+this.age); } public static void method(){ System.out.println(Person.country); } } class StaticDemo2{ public static void main(String[] args){ Person.method(); Person p = new Person("java",20); p.show(); } }
內存圖解為:
說明:
1.當執行StaticDemo2這個類時,就會在方法區中創建一個屬於該類的區域,並且加載默認的構造函數,接著在StaticDemo2的靜態區中加載main方法。
2.main方法進棧,並開始執行第一句代碼:Person.method(); 由於是類名的調用,虛擬機會在classpath環境變量下找Person類(沒有配置classpath則在當前目錄下找),找到後,就會把該類加載進方法區,同StaticDemo2也會分為靜態和非靜態區。
3.要執行method方法,所以method方法進棧,運行 System.out.println(Person.country);代碼,輸出“CN”。return掉該方法後,該方法出棧。
4.執行new Person對象的操作,該操作前上篇隨筆(構造函數中)已有分析,這裡不累述。
5.執行完所有代碼後,main方法出棧。
靜態代碼塊
static {
System.out.println("這是靜態代碼塊");
}
1.靜態代碼塊
隨著類的加載而執行,並且執行一次。屬於類。
2.作用
用於給類進行初始化。比如像javaAPI提供的Math類,全部為靜態的方法,不允許創建對象,這個時候不能用構造 函數進行初始化,因為構造函數一般是給對象初始化,不能創建對象時不可使用。所以就要使用靜態代碼塊來進行一些初始化的操作。
構造代碼塊
不同於靜態代碼塊,是屬於類的代碼塊,如:
class Demo{ { System.out.println("這是構造代碼塊"); } //。。。 }
和對象有關
可以給所有對象進行初始化,構造函數是給對應的對象進行針對性的初始化。
每次創建對象時都會執行。靜態代碼塊是在類加載時執行一次。