JAVA中的域,靜態域,實例域

1.java中的域

    所謂的域,翻譯成英文就是field, 也就是我們常說的字段,或者說是屬性。 比如類的字段(屬性),局部的,全局的。所謂域,其實是“field”的翻譯

然後實例域,就是 實例("object" )的"field"。包括實例域和靜態域,靜態域又叫類域。

    java中對象中的數據稱爲實例域(instance field)。

2.靜態域

 

      如果將域定義爲static,那麼每個類中只有一個這樣的域。而每一個對象對於所有的實例域卻都有自己的一份拷貝。例如,假定需要給每一個僱員賦予唯一的表示碼。這裏給Employee類添加一個實例域id和一個靜態域nextld:

class Employee

 {

     private int id;

     private static int nextId=1;

 }

現在,每一個僱員對象都有一個自己的id域,但這個類的所有實例將共享一個nextid域,換句話說,如果有1000個Employee類的對象,則有1000個實例域id,但是隻有一個靜態域nextid,即使沒有一個僱員對象,靜態域nextil也存在,他屬於類,而不屬於任何獨立的對象。

3.java中域的初始化

    初始化域即給域賦值有以下幾種方式:
      1)、賦予默認賦值
      2)、聲明變量時同時賦值
      3)、塊賦值(實例塊和靜態塊)
      4)、構造器賦值

    如果同時存在以上幾種賦值方式,那麼域的最終值會是哪個呢?這裏就涉及到域的初始化順序的問題,同時也是下面要講到的問題。
  
    我們把域的初始化分爲兩種情況,一種是在建立對象即進行類的實例化時域的初始化;另一種是在不建立對象,只裝載類的時候域的初始化。

  一、構建對象時域的初始化
    構建對象,就是用new class()語句建立一個新的類的對象。在這種情況下,類中的域是按照如下順序進行初始化的:賦予默認值-->(靜態域、靜態塊)-->(實例域、實例塊)-->構造器。
    下面我給解釋一下,假設一個域即變量int a,當建立對象時,首先賦予它一個默認值,int類型的默認值爲0;如果a爲靜態域並且在靜態塊中被賦值,那麼就按照靜態域和靜態塊在程序中出現的順序先後執行;如果同時還在實例塊中被賦值,則再執行實例塊中的賦值語句(靜態域不可能再是實例域);最後執行構造器中的賦值語句(如果在構造器中有被賦值的話)。如果變量a是實例域,則不會有靜態域和在靜態塊中賦值(不能在靜態塊中給實例域賦值)的情況,其他同前所述。
  
  總結:靜態域是指靜態域在聲明時被賦值,靜態塊是指在靜態塊中被賦值,實例域和實例塊同上。上面列出的四個步驟是先後執行的;括號中的兩種方式是同等級的,按照在程序中的順序執行,排在前面的先執行,排在後面的後執行。
  
  二、裝載類時域的初始化
    有兩種情況是隻裝載類而不實例化類,一是用java classname執行程序時;二是用classname.statement調用類的靜態域或靜態方法時。

  裝載類時這個類並沒有被實例化,也就不能形成對象,所以不能對實例域進行初始化。因此只有靜態域、靜態塊才能被初始化執行,執行規則同構建對象時的規則。


註明: 有寫不對的地方,忘大牛指點

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章