![](/img/trans.png)
[英]What is the difference between instance variables in a class or using them as parameters in a constructor in Java?
[英]What is the difference between local and instance variables in Java?
除了范圍和存儲差異之外,Java 中的實例變量和局部變量之間還有其他主要區別嗎?
我看到的主要區別在於:
范圍:局部變量僅在聲明它們的方法或塊中可見,而實例變量可以在類中的所有方法中看到。
聲明它們的位置:局部變量在方法或塊內聲明,而實例變量在類內但在方法外聲明。
存在時間:局部變量在方法被調用時創建,在方法退出時銷毀,而實例變量使用new創建並在沒有任何引用時由垃圾收集器銷毀。
訪問:您不能訪問局部變量,而實例變量如果聲明為公共變量則可以訪問。
聲明它們的位置:局部變量在調用之前在方法或塊中聲明,而實例變量可以在類級別的任何位置聲明(即使在使用之后)。
實例變量始終具有值,即使它們不是由代碼分配的(然后它們將具有例如 null、0、0.0 和 false)。 對於局部變量,必須有代碼賦值。 否則編譯器會產生錯誤。
我能想到的另一件事是:
實例變量被賦予默認值,即,如果它是對象引用,則為 null,如果它是 int,則為 0。
局部變量沒有默認值,因此需要顯式初始化(如果你沒有這樣做,編譯器通常會抱怨)。
另一個區別是您不必擔心對局部變量的並發訪問。 而您在多線程環境中使用實例變量。
不,你幾乎涵蓋了它。 一個實例變量屬於一個類的一個實例,一個局部變量屬於一個棧幀。
實例變量被初始化為默認值,但無論如何使用顯式初始化通常是一種好習慣。
一個局部變量:
一個實例變量:
false
、 null
等)-> 局部變量在方法體中聲明,並且只能從聲明它的點到方法聲明的末尾使用。
-> 實例變量在類中聲明,但不在任何類方法的主體中。 此外,類的所有方法都可以訪問實例變量。
除了這里已經提到的所有內容之外,我想指出,對於 JVM,局部變量的訪問速度要快一些。 與局部變量相比,JVM 需要做更多的工作來讀取或寫入實例變量。
對於當前的HotSpot服務器 JVM,這仍然是正確的,因為它不是 VM 優化問題。 而是由於實例變量在方法之外可見,因此可以在執行方法時從其他線程訪問。
除了前面答案中提到的所有差異之外,我想指出另一個差異,實例變量可以具有訪問修飾符(如私有、公共、受保護等),但局部變量將沒有任何訪問修飾符。
局部變量在棧上,但成員變量(實例變量)在堆上。
主要區別在於實例變量獲取默認值。 就像一個 int 值變為零,一個 char 變為零,但不是局部變量。
您可以保留未初始化的實例變量,但必須初始化局部變量,否則您將收到編譯器錯誤。
在方法、構造函數或塊中定義的變量稱為局部變量。 變量將在方法中聲明和初始化,並在方法完成時銷毀。
實例變量是類中但在任何方法之外的變量。 這些變量在類加載時被實例化。
局部變量在方法中聲明。
實例變量在類中聲明,但不在方法中。
局部變量沒有默認值。 如果您在變量初始化之前嘗試使用局部變量,編譯器會報錯。
但是,實例變量始終獲得默認值。 如果您沒有顯式地為實例變量賦值,則實例變量仍然具有值。
整數 0
浮點數 0
布爾假
引用空
存在時間:我想告訴您這些變量之間的主要重要區別在於,當我在軟件開發人員的生活中遇到實例變量的問題時。 用戶登錄時出現問題我必須返回登錄用戶的用戶名,但有一個問題,例如一個用戶登錄成功,但是當另一個用戶在程序運行時登錄時,它再次返回一個用戶名, 之前登錄過。 我確實像調試模式一樣運行程序,我可以在我的實例變量中看到一個問題,它可能是我的身份驗證方法中的局部變量。 我之所以這么說,是因為在編程語言中使用局部變量和實例變量時要小心。 所有的程序員都不會花足夠的時間來簡單地討論主題,但是小問題會產生很大的復雜性。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.