示例1:
class one
}
class two
}
public class test
}
輸出結果:
test main() start...
one-1
one-2
one-3
two
在 main() 方法中例項化了乙個 two 類的物件。但程式在初始化 two 類的物件時,並非先呼叫two 類的構造方法,而是先初始化 two 類的成員變數。這裡 two 類有 3 個成員變數,它們都是 one類的物件,所以要先呼叫 3 次 one 類的相應的構造方法。最後在初始化 two 類的物件。
示例2:
class one
}
class two
}
public class test
}
輸出結果:
test main() start...
one-3
one-1
one-2
two-1
one-1
one-2
two-2
如果乙個類中有靜態物件,那麼它會在非靜態物件前初始化,但只初始化一次。非靜態物件每次呼叫時都要初始化。示例3:
class one
}
class two
}
public class test
}
輸出結果:
one-3
one-1
one-2
two-3
test main() start...
one-1
one-2
two-1
one-1
one-2
two-2
程式中主類的靜態變數會在 main() 方法執行前初始化。結果中只輸出了一次 one-3 ,這也說明:如果乙個類中有靜態物件,那麼它會在非靜態物件前初始化,但只初始化一次。非靜態物件每次呼叫時都要初始化。
示例4:
class one
}
class two
}
public class test
}
不僅第 1 次建立物件時,類中所有的靜態變數要初始化,第 1 次訪問類中的靜態變數(沒有建立物件)時,該類中所有的靜態變數也要按照它們在類中排列的順序初始化。
綜上所述:
在建立物件時,物件所在類的所有資料成員會首先進行初始化,如果其中的成員變數有物件,那麼它們也會按照順序執行初始化工作。在所有類成員初始化完成後,才呼叫物件所在類的構造方法建立物件。構造方法作用就是初始化。
靜態物件(變數)在非靜態物件前初始化。靜態物件(變數)只初始化一次,再次呼叫就不初始化了,但非靜態物件在每次呼叫時都要初始化。
程式中的主類的靜態變數會在 main() 方法執行前進行初始化工作。
不僅第 1 次建立物件時,類中所有的靜態變數要初始化,第 1 次訪問類中的靜態變數(沒有建立物件)時,該類中所有的靜態變數也要按照它們在類中排列的順序初始化。
初始化的順序包括構造方法呼叫的順序如下:
1 .主類的靜態成員首先初始化。
2 .主類的超類的構造方法按照從最高到最低的順序被呼叫。
3 .主類的非靜態物件(變數)初始化。
4 .呼叫主類的構造方法。
在乙個構造方法中只能呼叫一次其它的構造方法,並且呼叫構造方法的語句必須是第一條語句。
多重繼承關係的初始化順序
多重繼承關係的初始化順序是 父類屬性 父類構造方法 子類屬性 子類構造方法 不能被子類繼承的父類成員 private成員 子類和父類不在同乙個包,使用預設訪問許可權的成員 構造方法 構造方法不會被重寫,因為不能被繼承。1 super關鍵字來訪問父類的成員 2 super只能出現在子類的方法和構造方法...
繼承類的初始化
執行時,先訪問main函式。載入器開始啟動並找出該類的編譯 載入時,由於extends知道有乙個基類,於是載入基類。如果基類仍舊有基類,那麼再載入。直到所有的基類載入完畢。很重要的一點是static方法是在載入類的時候就被執行了,而static域也在此時也會在此時進行初始化。所有的類載入完畢。開始建...
類的初始化順序
寫了這麼多類 還沒仔細考慮過初始化順序 今天特意看了點這方面的知識 照著寫了個例子 初始化順序是 靜態變數 靜態初始化快 變數 初始化塊 建構函式 例子如下 public class classinitorder public classinitorder public static void ma...