一.靜態成員變量
1.屬於整個類而不是某個對象實例,所以可以直接通過類名和對象名去調用。
2.靜態成員屬於整個類,當系統第一次使用該類時,就會為其分配內存空間直到該類被卸載才會進行資源回收
二.靜態方法
1.靜態方法中可以直接調用同類中的靜態成員,但不能直接調用非靜態成員;如果希望在靜態方法中調用非靜態變量,可以通過創建類的對象,然后通過對象來訪問非靜態變量
2. 在普通成員方法中,則可以直接訪問同類的非靜態變量和靜態變量
3. 靜態方法中不能直接調用非靜態方法,需要通過對象來訪問非靜態方法
注:靜態方法是屬於類的,內存必須為它分配內存空間,這個空間一直由靜態方法占用,內存管理器不會由於靜態方法沒有被調用而將靜態方法的存儲空間收回,這樣如果將所有的方法都聲明為靜態方法,就會占用大量的內存空間,最后是系統變慢。而普通的成員方法是由對象調用的,內存並不會一直為起分配內存,只有調用的時候才為其分配存儲空間,而當其沒有被調用時,存儲空間就會被內存管理其收回,釋放沒有用的空間,提高的系統的運行速率
三.初始化塊和靜態初始化塊
1.為什么要有初始化?
答:初始化塊就是構造器的補充,初始化塊是不能接收任何參數的,定義的一些所有對象共有的屬性、方法等內容時就可以用初始化塊初始化了
好處是可以提高初始化塊的復用,提高整個應用的可維護性
2.有初始化塊和靜態初始化塊的區別?
答:(1)程序運行時靜態初始化塊最先被執行,然后執行普通初始化塊,最后才執行構造方法。
(2)靜態初始化塊只在類加載時執行一次,且只能初始化靜態成員變量,不能初始化普通變量
注:java中沒有靜態構造函數,通過靜態代碼塊完成類似作用
1 public class HelloWorld {
2
3 String name; // 聲明變量name 4 String sex; // 聲明變量sex 5 static int age;// 聲明靜態變量age 6 7 // 構造方法,手動聲明構造方法之后,不論聲明的是有參還是無參的構造方法,系統都不會再自動生成無參的構造方法 8 public HelloWorld () { 9 System.out.println("通過構造方法初始化name"); 10 name = "tom"; 11 } 12 13 // 初始化塊 14 { 15 System.out.println("通過初始化塊初始化sex"); 16 sex = "男"; 17 } 18 19 // 靜態初始化塊,只在類加載的時候初始化一次,且只能初始化靜態成員變量,不能初始化普通變量 20 static { 21 System.out.println("通過靜態初始化塊初始化age"); 22 age = 20; 23 } 24 25 public void show() { 26 System.out.println("姓名:" + name + ",性別:" + sex + ",年齡:" + age); 27 } 28 29 public static void main(String[] args) { 30 31 // 創建對象 32 HelloWorld hello = new HelloWorld(); 33 // 調用對象的show方法 34 hello.show(); 35 HelloWorld hello1 = new HelloWorld(); 36 } 37 }
這是輸出結果:
通過靜態初始化塊初始化age 通過初始化塊初始化sex 通過構造方法初始化name 姓名:tom,性別:男,年齡:20 通過初始化塊初始化sex 通過構造方法初始化name