簡體   English   中英

如果用Java創建的對象存儲在堆中,我們如何能夠創建多個同名對象

[英]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);
    }

就其他方面而言,其他答案都是正確的,但我認為它們忽略了使您感到困惑的最重要的觀點。

tn不是對象。 它們是變量

變量有名稱。 對象沒有。 Java中的對象只能間接訪問。 命名的Java變量包含對無名對象的引用 ,該對象位於堆中的某個位置。

變量可以存在於以下任何位置:

實例變量位於對象內部。

變量(又稱static變量)位於Class對象內部。

局部變量和函數參數變量位於稱為激活記錄的數據結構中,該數據結構位於調用堆棧中

調用棧和激活記錄不是Java對象,並且沒有顯式訪問它們的方法。 每個線程都有其自己的調用堆棧,而其他任何線程都無法訪問該堆棧。

所以,如果你有你的十個激活 run()函數在十個不同的線程,每個線程激活都有自己單獨的tn局部變量。

這稱為可變范圍 每個參考名稱都有其范圍,在其外部不可見。 在您的示例引用中,在方法主體中定義了String tInteger n 此范圍稱為local 您只能在方法run體內引用這些引用下的對象。 並且每個線程將具有其自己的run方法(代碼將相同,但對象將有所不同),並且由於您無法在run之外獲取此引用,因此不能干涉。

在運行時,每次進程創建一個對象時,Java都會為它們提供不同的引用(您可以在調試模式下進行檢查)。

代碼中的變量為此引用命名,因此您可以操作對象,但只能在其作用域內 (大約在花括號之間)。

任何新的run執行都會創建一個新對象,該對象只能由您的局部變量(在其范圍內)引用,因此您將不得不設計一種訪問這些對象的方法,也許將您的引用保存到類級別的某種列表中(課程范圍)。

暫無
暫無

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

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