java简述对象的组合_Java程序运行和对象创建过程简述
Java中一個對象創建分為兩個步驟: 加載類,創建對象。
加載類是將所寫的程序.java文件編譯生成的.class文件加載到內存中,保證了對象創建的預置環境。類加載完畢后才可以創建該類的對象。
第一步:加載類
1. 當開始運行一個類,虛擬機首先試圖訪問指定啟動類的 .main() 方法,加載該類的 .class 文件。
2. 如果該類有父類,那么繼續加載其父類,以此類推,直到加載出所有與main入口類相關的類(它的父類,父類的父類等)。
3. 接著,從其頂級父類開始,對其static域按照順序進行初始化!直至初始化完所有類的static域。>將static域放到靜態存儲區。
4. 至此類的加載工作完畢了,下面就進入main函數,執行main函數。一般main函數中來創建類的對象,如果發現要創建的類沒有被加載,則繼續加載該類)
第二步:對象創建
1. 為對象獲取內存,然后將內存全部置為0,此時對象中的所有屬性都是被賦予0的默認值(內存為0時候的默認值:null-對象引用,0-int,false-boolean...)> 在堆中生成對象所需空間,全部初始化為0,具體成員屬性值為堆上對應內存子塊--正是因為這種機制,所以java可以保證所有的類對象的屬性都會被初始化,但是局部不會被初始化。
這里需要注意的是:一個對象內部組合了另一個對象,那么在堆中其實存的也是一個引用,這個引用指向被組合對象的堆內存地址(另外再創建)。
當引用在內存的二進制數據都為0的時候,他的表現形式是null;當他指向的數據內容內存區數據都是0的時候,他的值為0,"",False等初始標準值。所謂初始化就是修改內存區的二進制數據,因為對象在創建時候第一步就將內存清0,所以保證了所有屬性都能至少被初始化為標準初值!
但是局部變量不一樣,你不初始化,只是申明,那么開辟的內存區在棧中值會是一個未知數據(一旦使用該引用的話,使用的可能是你沒有初始化而瞎幾把亂指的地址)所以Java會代碼檢驗的時候發現你使用了未初始化的引用,直接給予不通過,直接杜絕了這種可能性的發生。
綜上,Java中使用任何變量或引用,必須初始化,初始化就是將內存中舊的二進制數據要么清0,要么賦予你要賦的值!
2. 從頂級父類開始,按照申明順序將給頂級父類的非static的成員屬性初始化(static的只初始化一次在類加載階段)> 用屬性定義的值覆蓋0值。
3. 調用頂級父類的構造函數,如果有成員屬性初始化則覆蓋前一個申明時初始化值。> 構造函數再次初始化,覆蓋前面申明時初始化。
4. 以此類推,將所有的父級(先初始化屬性,在調用構造,一層一層的構造完畢) 構造完成
5. 最后,初始化當前類的非static屬性,再調用當前類的構造函數,完成所有初始化工作。
注意:
1、類中static部分是發生在類加載時期的,并且只初始化一次。因為類只加載一次,加載完后創建對象過程中不會再去初始化static部分的東西,所以之后根本不會再走那塊初始化代碼,又怎么初始化第二次呢?
2、static的優先級是高于main函數執行的,因為它是在類加載時期初始化。當static作用的東西都加載完了才執行main,當然main是第一個被使用的static方法,但是虛擬機只是找到這個方法的位置,并不會先去執行里面的內容。
2、對于類的普通成員屬性初始化三個步驟:先全初始化為0,再用申明時候初始化值進行初始化,再調用構造函數進行初始化。
實例程序:(來源于Thinking in Java)
//: reusing/Beetle.java
// The full process of initialization.
import static net.mindview.util.Print.*;
class Insect {
private int i = 9;
protected int j;
Insect() {
print("i = " + i + ", j = " + j);
j = 39;
}
private static int x1 =
printInit("static Insect.x1 initialized");
static int printInit(String s) {
print(s);
return 47;
}
}
public class Beetle extends Insect {
private int k = printInit("Beetle.k initialized");
public Beetle() {
print("k = " + k);
print("j = " + j);
}
private static int x2 =
printInit("static Beetle.x2 initialized");
public static void main(String[] args) {
print("Beetle constructor");
Beetle b = new Beetle();
}
}/* Output:
static Insect.x1 initialized
static Beetle.x2 initialized //1.類加載和初始化靜態x1,x2:只會初始化一次!
Beetle constructor //2.進入main函數
i = 9, j = 0
//3.new Beetle(),先初始化父類>申請父類內存>初始化為0>初始化i=9,j=0>調用Insect()構造函數>輸出ij值>初始化j=39
Beetle.k initialized //4.初始化子類>申請子類內存>..>初始化k,輸出改行>調用構造Beetle()>輸出下面的k,j
k = 47
j = 39
*///:~
總結
以上是生活随笔為你收集整理的java简述对象的组合_Java程序运行和对象创建过程简述的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: java web项目目录报错_netde
- 下一篇: 12万吨核动力补给舰与航母的差异