[英]How are we able to create more than one object of same name if object created in Java are stored in heap
( http://tutorials.jenkov.com/images/java-concurrency/java-memory-model-2.png) (我無法在此處粘貼圖表。但是給出了鏈接)
特別是在該鏈接http://tutorials.jenkov.com/java-concurrency/java-memory-model.html上 ,可以說,創建的對象存儲在Heap中,無論創建它的是哪個線程。 現在,我想問一下是否要在run()方法中創建相同的對象,並說創建10個線程並啟動它們,我的問題是,如何創建具有相同名稱的對象?
public void run(){
String t = new String();
Integer n = new Integer(5);
}
就其他方面而言,其他答案都是正確的,但我認為它們忽略了使您感到困惑的最重要的觀點。
t
和n
不是對象。 它們是變量 。
變量有名稱。 對象沒有。 Java中的對象只能間接訪問。 命名的Java變量包含對無名對象的引用 ,該對象位於堆中的某個位置。
變量可以存在於以下任何位置:
實例變量位於對象內部。
類變量(又稱static
變量)位於Class
對象內部。
局部變量和函數參數變量位於稱為激活記錄的數據結構中,該數據結構位於調用堆棧中 。
調用棧和激活記錄不是Java對象,並且沒有顯式訪問它們的方法。 每個線程都有其自己的調用堆棧,而其他任何線程都無法訪問該堆棧。
所以,如果你有你的十個激活 run()
函數在十個不同的線程,每個線程激活都有自己單獨的t
和n
局部變量。
這稱為可變范圍 。 每個參考名稱都有其范圍,在其外部不可見。 在您的示例引用中,在方法主體中定義了String t
和Integer n
。 此范圍稱為local 。 您只能在方法run
體內引用這些引用下的對象。 並且每個線程將具有其自己的run方法(代碼將相同,但對象將有所不同),並且由於您無法在run
之外獲取此引用,因此不能干涉。
在運行時,每次進程創建一個對象時,Java都會為它們提供不同的引用(您可以在調試模式下進行檢查)。
代碼中的變量為此引用命名,因此您可以操作對象,但只能在其作用域內 (大約在花括號之間)。
任何新的run執行都會創建一個新對象,該對象只能由您的局部變量(在其范圍內)引用,因此您將不得不設計一種訪問這些對象的方法,也許將您的引用保存到類級別的某種列表中(課程范圍)。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.