標籤:編譯錯誤 設定 class 執行 過程 產生 空間 執行個體 靜態變數
6、成員初始化
java盡量保證:所有變數在使用前都能得到恰當的初始化。對於方法的局部變數,java以編譯錯誤的形式來貫徹這種保證。
如果類的成員變數時基本類型,那麼沒有初始化給預設值
在類裡定義一個引用對象時,如果不將其初始化,此引用就會獲得一個特殊值null
7、構造器初始化
可以用構造器來進行初始化。但要牢記:無法阻止自動初始化的進行,它將在構造器被調用之前發生。
初始化順序
變數定義的先後順序決定了初始化的順序。即使變數定義與散佈於方法定義之間,它們仍然會在任何方法(包括構造器)被調用之間得到初始化
待用資料的初始化
無論建立多少個對象,待用資料都只佔用一份儲存地區。static關鍵字不能應用於局部變數,因此它只能作用於域。如果一個域是靜態基本類型域,也沒有進行初始化,那麼它就會獲得基礎資料型別 (Elementary Data Type)的標準初始值,如果它是引用資料類型,那麼它的預設初始值就是null。
靜態初始化只有在必要時刻才會進行。如果不建立Table對象,也不引用Table.b1或者Table.b2,那麼靜態Bowl b1和b2永遠都不會被建立。只有在第一個Table對象被建立(或者第一次訪問待用資料)的時候,它們才會被初始化。
初始化的順序是先靜態對象,而後面是非靜態對象
總結一下對象的建立過程,假設有一個名為Dog的類。
1、即使沒有顯式使用static關鍵字,構造器實際上也是靜態方法。因此,當首次建立類型為Dog的對象或者Dog的靜態方法/靜態域被首次訪問時,Java解析器必須尋找類路徑,以定位Dog.class檔案。
2、然後載入Dog.class,有關靜態初始化的所有動作都會執行。因此,靜態初始化只在Class對象首次載入的時候進行一次
3、當用new Dog()建立對象的時候,首先將堆上為Dog對象分配足夠的儲存空間
4、這Block Storage空間會被清零,這就自動地將Dog對象中的所有基本類型都設定成了預設值,而引用則被設定成了null
5、執行所有出現於欄位定義出的初始化操作
6、執行構造器
顯式的靜態初始化
java允許將多個靜態初始化動作組織成一個特殊的“靜態子句”,有時也叫做“靜態代碼塊”。儘管它看起來想個方法,但實際上只是一段跟在static關鍵字後面的代碼。與其他靜態初始化動作一樣,這段代碼僅執行一次:當首次產生這個類的一個對象時,或者首次訪問屬於那個類的待用資料成員時。
非講台執行個體初始化
Java中也有被稱為執行個體初始化的類似文法,用來初始化每一個對象的非靜態變數。
它們與靜態初始化子句是一模一樣的,只不過少了static關鍵字。這種文法對於支援匿名內部類的初始化是必須的,但是它也使得你可以保證無論調用了哪個顯式構造器,某些操作都會發生。執行個體初始化子句是在構造器之前執行的。
java的初始化(編程思想)