JVM執行new語句建立物件時,內部的執行過程是怎樣的

2022-09-19 14:49:57 字數 1528 閱讀 5972

1樓:

j**a中new一個物件的時候jvm都做了哪些事

2樓:tangshan親

new就是建立類例項的過程,首先載入類進記憶體,靜態和方法載入進方法區,在堆記憶體開闢空間,將hashcode地址賦值給引用變數,將類中成員變數預設初始化,將類中成員變數實現,new的建構函式有初始化的話,先進行構造**塊初始化,然後進行建構函式初始化。如果是繼承類的話,建構函式初始化的時候要先載入父類。

j**a程式執行時,沒有賦值的基本型別變數會在記憶體中分配空間嗎? 20

3樓:匿名使用者

看不懂你說什麼,不過好像大致沒錯,你說的這種情況和普通物件類似.

簡單說,棧存的是地址,堆存的是具體資料

你說的沒有賦值的基本型別,比如方法中的基本型別就這樣的情況不過不賦處置,編譯器都過不了

不賦初值的不是你說的這種情況

4樓:x證

要看你這句int a處於什麼地方,如果是在方法內部中被執行到,也就是說是區域性變數,就會在棧記憶體中分配記憶體,由於是int型,所以就是4位元組,也就是32bit,long型別的才會是64bit。

而你說的表示地址我們稱為堆記憶體。建立的物件以及物件中的方法和資料是儲存在堆記憶體中的。jvm會在棧記憶體中建立物件的引用,然後當執行到new語句時,在堆記憶體中建立物件,這時就將這個物件的型別以及這塊區域的記憶體地址值賦給引用,然後進行物件中資料的初始化。

也就是說,物件的引用儲存在棧記憶體中,存放的是型別以及hash值,如integer@0xff67。而物件裡的內容實際上是儲存在堆記憶體中的。

如果你這句int a只是在某個物件內作為成員變數,那麼根本不會涉及到棧記憶體。a就儲存在它所在的那個物件的堆記憶體中。明白了麼?

j**a中建立物件的的兩種方式具體解釋,一個是new一個是呼叫class類的newinstance方法?

5樓:匿名使用者

第二種是反射,用的並不多

j**a中new物件的時候與構造方法是否同時執行. 5

6樓:匿名使用者

new一個物件的時候,根據所填引數自動匹配相對應的構造方法(同一個類的改造方法可以有多個)。

你這個問題其實很容易驗證吧?構造方法裡用system.out.println();在後臺輸出個語句不就驗證構造方法是否執行了?

方法比答案重要。。。

7樓:

用new建立物件時會自動呼叫構造方法。

8樓:

new的時候自動呼叫相關的建構函式

9樓:匿名使用者

new就呼叫建構函式咯

10樓:飄落的飛血

這個知道一下有什麼用啊

C中SQL語句執行

insert into vip.dbo 會員賬號 姓名,卡號,手機,qq values this.textbox1.text.trim int.parse this textbox2 text trim int.parse this textbox3 text trim int.parse text...

verilog語句執行順序的疑問

可綜合的都是並行執行的。其實也不難理解,verilog是硬體語言,也就可以看成是一個電路。在實際的電路中沒辦法延遲,沒辦法讓一邊先通電,再讓另一邊通電,所以一切都是同時進行的。這並行的前提都是 可綜合 如果是寫testbench,會用到不可綜合的模組,這些模組是行為級的,在實際電路中無法實現。比如t...

mybatis為什麼執行select語句是,返回的結果都是空的

這個很大的原因是你資料庫中本身執行的改sql返回的就是空,你可以把改sql複製出來直接放到資料庫中執行一次 sql語句貼出來,部分函式會影響資料,你可以看到有個orderid 0,表示執行你的sql在資料庫裡面能查到資料,只不過不是正常的結果。為什麼mybatis生成的sql語句可以正確執行,但是返...