我知道局部變量是分配在堆棧上的,因爲成員變量或實例變量分配在堆上。但是我很好奇,爲什麼JVM不能爲堆棧上的局部變量分配一個默認值(如果它沒有賦值)(調用該方法時)?這與編譯器/ JVM /處理器的工作方式有關嗎?局部變量在使用前必須被初始化,例如變量,沒有這樣的限制,爲什麼?
回答
它可以。但是,最常見的錯誤之一是無意中未初始化的局部變量。根據定義制定非法的這些錯誤可以通過靜態分析來捕獲這些錯誤。
從JLS 3, in section "4.12.5 Initial Values of Variables":
局部變量(§14.4,§14.14)必須被明確地給出的值 在使用之前,通過任一初始化(§14.4)或分配 (§15.26),可以通過編譯器使用 規則進行明確分配(§16)來驗證。
你爲什麼要這樣的行爲?如果你聲明一個變量用於本地使用,你是不是想盡快將它初始化爲它所需的初始值?實例變量初始化爲實例初始化時的默認值,因爲它們的生命週期大於聲明和初始化的範圍。
我的問題是從其他角度。在C中,聲明的變量總是有一些默認值。那麼爲什麼在java中不一樣呢?當然,必須有理由。這就是我的問題所在。 – Santosh
這不是堆棧/堆問題。 Java的設計有幾個很好的簡單編程風格的項目。 你想要一個對象被毫無疑問地初始化。對於局部變量,編譯器在初始化之前可能會很容易地發出警告。此外,樣式聲明+初始化是期望的:
int n = takeN();
初始化將需要歸零堆棧幀,這是不必要的開銷。
這可能有幾個原因。一對夫婦:
首先,如前所述,未初始化的變量是錯誤的主要來源,雖然檢查未初始化的實例變量是不切實際的,但編譯器很容易檢查並「診斷」未初始化的局部變量 - 它實際上是在數據流分析的額外努力下付諸東流。
其次,初始化局部變量需要時間。實例變量可以通過簡單地將實例歸零來「初始化」,並且它只需要爲每個實例發生一次(並且需要爲「安全」和GC目的完成),但局部變量在這裏和那裏被分配 - 一些在堆棧中,一些在寄存器中,並且清除它們每次調用方法都需要實際的週期。
- 1. 爲什麼局部變量必須被初始化,爲什麼實例變量在使用之前不能被初始化?
- 2. 爲什麼變量必須被初始化?
- 3. 爲什麼這個變量沒有被初始化?
- 4. 爲什麼我必須將指針初始化爲變量?
- 5. ASP.NET - 隱式類型的局部變量必須初始化
- 6. 初始化局部變量
- 7. 爲什麼Java說我的變量在初始化時沒有被初始化?
- 8. Android的 - 局部變量TST可能沒有被初始化
- 9. 變量「可運行」必須初始化
- 10. 爲什麼最終的實例變量需要初始化,當一個最終的局部變量沒有?
- 11. 什麼時候必須在Tensorflow中初始化變量?
- 12. 一些變量可能沒有被初始化?爲什麼?
- 13. 局部變量GCD可能沒有被初始化
- 14. 局部變量n可能沒有被初始化
- 15. 錯誤:局部變量罐可能沒有被初始化
- 16. 爲什麼這個成員變量沒有正確初始化?
- 17. 爲什麼局部變量不能用默認值初始化?
- 18. 爲什麼在Java中必須初始化嵌套循環控制變量?
- 19. 什麼時候全局靜態常量變量被初始化?
- 20. 這些變量如何被初始化?
- 21. 爲什麼我變量 - 正在使用而沒有被初始化錯誤?
- 22. 爲什麼這個全局變量沒有被改變?
- 23. 實例變量未初始化。這是爲什麼?
- 24. 有沒有解決局部變量的方式可能沒有被初始化
- 25. 爲什麼必須始終在Java中初始化局部變量,包括基元?
- 26. 爲什麼變量初始化爲0?
- 27. C4700:未初始化的局部變量
- 28. 未初始化的局部變量!
- 29. 局部變量初始化的Java
- 30. 未初始化的局部變量
[未初始化變量和Java成員](http:// stackoverflow。com/questions/268814 /未初始化變量和成員在Java) – dogbane