亚洲在线久爱草,狠狠天天香蕉网,天天搞日日干久草,伊人亚洲日本欧美

為了賬號安全,請及時綁定郵箱和手機立即綁定
已解決430363個問題,去搜搜看,總會有你想問的

內存中返回(并且沒有返回)的對象會發生什么?

內存中返回(并且沒有返回)的對象會發生什么?

慕的地8271018 2021-08-25 09:58:32
這個問題是關于 Java,以及如何創建、傳遞和“刪除”對象。據我所知,當你想創建一個對象時,你使用“new”關鍵字。根據我的理解,這個操作符 (new) 為對象分配內存,= 操作符將引用分配給這個對象在內存中的位置,給你給它的變量名。例如,假設您像這樣在 Java 中創建了一個數組。int[] arrayX = new int[size];的=操作者現在存儲參考存儲器陣列到變量名arrayX。這一切都很好。現在讓我們考慮方法(函數)。首先,根據我的理解,當您調用一個方法時,會在堆棧上為該方法的變量和進程分配內存,當該方法返回時,堆棧上的實例將被關閉/刪除/放入垃圾中。但是,這并沒有解釋如何使用 return 關鍵字將在方法中創建的對象(例如數組)返回到調用者的作用域。據我了解,由于該方法正在返回,因此其堆棧中的數據將被刪除。因此,在此方法范圍內創建的數組也將被刪除。因此,返回到數組位置的引用將指向“垃圾”值。然而,情況顯然并非如此。在 Java 中,如果您返回一個對象,則可以繼續使用它。這讓我對如何創建、存儲和返回對象感到困惑......創建的對象是否總是存儲在永久內存中?或者確實的return操作者移動從方法的臨時堆疊到調用者的堆棧中的數組或對象?如果第二種情況為真,那么在方法返回給調用者(但不返回對象)后,方法中創建的對象是否被刪除?在這第三種情況下,這意味著人們不應該擔心在方法中創建對象,因為這些對象將被刪除。因此,如果一個程序要調用一個方法 1000 次,我們就不必擔心內存會被我們只使用一次的對象填滿。我已經瀏覽了 edX 上提供的 Java 課程,甚至閱讀了一本書(雖然沒有完成),但仍然沒有找到答案,所以我很感激你的意見(如果你知道的話)。編輯:請注意,這個問題詢問 3 個單獨的問題:1. 對象和原語存儲在哪里 2. new 運算符具體做什么 3. 返回運算符做什么
查看完整描述

2 回答

?
莫回無

TA貢獻1865條經驗 獲得超7個贊

但是,這并沒有解釋如何使用 return 關鍵字將在方法中創建的對象(例如數組)返回到調用者的作用域

你可以這樣做的原因是對象不是在堆棧上創建的;只有對它的引用。該數組一直保留在動態分配的內存中,直到它符合垃圾回收條件。當您將方法返回的結果分配給另一個變量或字段時,引用的值會被保留,因此對象會保留在內存中。

返回運算符是否將數組或對象從方法的臨時堆棧移動到調用者的堆棧?

只有引用的值被復制。引用是一個相對較小的對象,其大小僅取決于運行 JVM 的系統。特別是引用的大小不會隨著被引用對象的大小而改變,因此需要復制的數量是有限的。


查看完整回答
反對 回復 2021-08-25
?
青春有我

TA貢獻1784條經驗 獲得超8個贊

需要注意的重要一點是,如果您在方法中返回一個對象并且不保存它,它實際上會被垃圾收集。例如,如果您有:


public int somemethod(){

    int myint = 9;

    return myint;

}

然后調用someMethod()您的 main 方法,為了將來訪問此返回,您必須存儲它。


public static void main(String [] args){

    this.someMethod(); //can't access myInt.

    int savedInt = someMethod(); // Saves the value 9 for future access.

}

所以一般來說,當你調用一個方法然后返回類型在該方法從堆棧中移除之前存在時,但是為了將來使用它,你必須將值存儲在一個仍然存在的變量中。


查看完整回答
反對 回復 2021-08-25
  • 2 回答
  • 0 關注
  • 192 瀏覽
慕課專欄
更多

添加回答

舉報

0/150
提交
取消
微信客服

購課補貼
聯系客服咨詢優惠詳情

幫助反饋 APP下載

慕課網APP
您的移動學習伙伴

公眾號

掃描二維碼
關注慕課網微信公眾號