簡體   English   中英

Java中的局部變量和實例變量有什么區別?

[英]What is the difference between local and instance variables in Java?

除了范圍和存儲差異之外,Java 中的實例變量和局部變量之間還有其他主要區別嗎?

我看到的主要區別在於:

范圍:局部變量僅在聲明它們的方法或塊中可見,而實例變量可以在類中的所有方法中看到。

聲明它們的位置:局部變量在方法或塊內聲明,而實例變量在類內但在方法外聲明。

存在時間:局部變量在方法被調用時創建,在方法退出時銷毀,而實例變量使用new創建並在沒有任何引用時由垃圾收集器銷毀。

訪問:您不能訪問局部變量,而實例變量如果聲明為公共變量則可以訪問。

聲明它們的位置:局部變量在調用之前在方法或塊中聲明,而實例變量可以在類級別的任何位置聲明(即使在使用之后)。

實例變量始終具有值,即使它們不是由代碼分配的(然后它們將具有例如 null、0、0.0 和 false)。 對於局部變量,必須有代碼賦值。 否則編譯器會產生錯誤。

我能想到的另一件事是:

實例變量被賦予默認值,即,如果它是對象引用,則為 null,如果它是 int,則為 0。

局部變量沒有默認值,因此需要顯式初始化(​​如果你沒有這樣做,編譯器通常會抱怨)。

另一個區別是您不必擔心對局部變量的並發訪問。 而您在多線程環境中使用實例變量。

不,你幾乎涵蓋了它。 一個實例變量屬於一個類的一個實例,一個局部變量屬於一個棧幀。

實例變量被初始化為默認值,但無論如何使用顯式初始化通常是一種好習慣。

一個局部變量:

  • 在方法/構造函數內或塊內聲明(用大括號括起來)
  • 必須在使用前進行初始化。 否則它不會編譯。

一個實例變量:

  • 在類中聲明。
  • 初始化不是強制性的:如果省略,則包含默認值(0、0.0、 falsenull等)

-> 局部變量在方法體中聲明,並且只能從聲明它的點到方法聲明的末尾使用。

-> 實例變量在類中聲明,但不在任何類方法的主體中。 此外,類的所有方法都可以訪問實例變量。

除了這里已經提到的所有內容之外,我想指出,對於 JVM,局部變量的訪問速度要快一些。 與局部變量相比,JVM 需要做更多的工作來讀取或寫入實例變量。

對於當前的HotSpot服務器 JVM,這仍然是正確的,因為它不是 VM 優化問題。 而是由於實例變量在方法之外可見,因此可以在執行方法時從其他線程訪問。

除了前面答案中提到的所有差異之外,我想指出另一個差異,實例變量可以具有訪問修飾符(如私有、公共、受保護等),但局部變量將沒有任何訪問修飾符。

局部變量在棧上,但成員變量(實例變量)在堆上。

主要區別在於實例變量獲取默認值。 就像一個 int 值變為零,一個 char 變為零,但不是局部變量。

您可以保留未初始化的實例變量,但必須初始化局部變量,否則您將收到編譯器錯誤。

在方法、構造函數或塊中定義的變量稱為局部變量。 變量將在方法中聲明和初始化,並在方法完成時銷毀。

實例變量是類中但在任何方法之外的變量。 這些變量在類加載時被實例化。

局部變量在方法中聲明。

實例變量在類中聲明,但不在方法中。

局部變量沒有默認值。 如果您在變量初始化之前嘗試使用局部變量,編譯器會報錯。

但是,實例變量始終獲得默認值。 如果您沒有顯式地為實例變量賦值,則實例變量仍然具有值。

整數 0

浮點數 0

布爾假

引用空

存在時間:我想告訴您這些變量之間的主要重要區別在於,當我在軟件開發人員的生活中遇到實例變量的問題時。 用戶登錄時出現問題我必須返回登錄用戶的用戶名,但有一個問題,例如一個用戶登錄成功,但是當另一個用戶在程序運行時登錄時,它再次返回一個用戶名, 之前登錄過。 我確實像調試模式一樣運行程序,我可以在我的實例變量中看到一個問題,它可能是我的身份驗證方法中的局部變量。 我之所以這么說,是因為在編程語言中使用局部變量和實例變量時要小心。 所有的程序員都不會花足夠的時間來簡單地討論主題,但是小問題會產生很大的復雜性。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM