1. 程式人生 > 實用技巧 >1-4-2 Java面向物件--static和程式碼塊

1-4-2 Java面向物件--static和程式碼塊

static

靜態成員和非靜態成員

靜態成員

靜態成員是屬於整個類的,由類所進行維護,僅在類初次載入時會被初始化,在類銷燬時回收。
通過該類例項化的所有物件都共享類中靜態資源,任一物件中資訊的修訂都將影響所有物件。
由於靜態成員在類載入期間就已經完成初始化,儲存在Java Heap(JDK7.0之前儲存在方法區)中靜態儲存區,因此優先於物件而存在,可以通過類名和物件名兩種方式訪問。

非靜態成員

非靜態成員屬於物件獨有,每個物件進行例項化時產生各自的成員,隨著物件的回收而釋放。
物件對各自成員資訊的修訂不影響其他物件
只能通過物件名訪問。

注意:

類外可應用“類名.成員名”或“物件名.成員名”的方式訪問非私有靜態成員,更推薦用“類名.成員名”體現其特性。應用“物件名.成員名”時會出現警告,但不影響程式執行。

類內可應用“類名.成員名”或“this.成員名”或“成員”的方式訪問,應用“this.成員名”時會出現警告,但不影響程式執行。

靜態方法和非靜態方法

靜態方法:用static修飾的成員方法,通常也稱為靜態方法、類方法、全域性方法等。

非靜態方法:沒有被static修飾的成員方法,也稱為叫做非靜態方法、例項方法,物件方法等。

特徵

與靜態成員相似,靜態方法屬於整個類的,由類所進行維護,優先於物件而存在,因此可以通過類名和物件名兩種方式訪問,也因此在靜態方法中無法直接訪問同類中的非靜態成員。

總結

靜態方法中不能直接訪問同一個類的非靜態成員,只能呼叫同一個類靜態成員.

只能通過物件例項化後,物件.成員方法的方法訪問.
靜態方法不能使用this.

靜態程式碼塊

概念

靜態程式碼塊:被static修飾的,定義在類內部,用{}括起的程式碼段。
構造程式碼塊:沒有被static修飾的,定義在類內部,用{}括起的程式碼段。
普通程式碼塊:定義在方法內部,用{}括起的程式碼段。

特徵

靜態程式碼塊:
只能出現在類內,不允許出現在方法內。
可以出現多次,按順序在類載入時執行。
無論該類例項化多少物件,只執行一次。

構造程式碼塊:
可以在類內出現多次,按順序在每個物件例項化時執行。
執行優先順序:晚於靜態程式碼塊,高於構造方法。
每次執行物件例項化時,均會執行一次。

普通程式碼塊:

可以在方法內出現多次,按順序在方法呼叫時執行。

應用

靜態程式碼塊:基於效能優化的考量,多適用於需要在專案啟動時執行一次的場景,譬如專案資源整體載入等。
構造程式碼塊:多適用於類中每個物件產生時都需要執行的功能封裝。與構造方法的區別在於,構造方法是在new執行時有選擇性的呼叫帶參或者無參構造,而構造程式碼塊則是,在每個物件例項化時都一定會執行。
普通程式碼塊:適用於在方法內進行程式碼功能拆分。

 1 public class Car {
 2     static String field;
 3 
 4     static {
 5         field = "欄位1";
 6         System.out.println("我是靜態程式碼塊1");
 7     }
 8 
 9     static {
10         field = "欄位2";
11         System.out.println("我是靜態程式碼塊2");
12     }
13 
14     {
15         field = "欄位3";
16         System.out.println("我是構造程式碼塊1");
17     }
18 
19     {
20         field = "欄位4";
21         System.out.println("我是構造程式碼塊2");
22     }
23 
24     public Car() {
25         System.out.println("我是構造方法");
26     }
27 
28     public void show() {
29         System.out.println("欄位show:" + field);
30     }
31 
32 }
 1 public class CarTest {
 2 
 3     public static void main(String[] args) {
 4         Car one = new Car();
 5         one.show();
 6         System.out.println("******************************");
 7         Car two = new Car();
 8         two.show();
 9         //我是靜態程式碼塊1
10         //我是靜態程式碼塊2
11         //我是構造程式碼塊1
12         //我是構造程式碼塊2
13         //我是構造方法
14         //欄位show:欄位4
15         //******************************
16         //我是構造程式碼塊1
17         //我是構造程式碼塊2
18         //我是構造方法
19         //欄位show:欄位4
20     }
21 }