日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程语言 > java >内容正文

java

java简述对象的组合_Java程序运行和对象创建过程简述

發布時間:2025/4/5 java 21 豆豆
生活随笔 收集整理的這篇文章主要介紹了 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程序运行和对象创建过程简述的全部內容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。