首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
您现在的位置: 程式碼之家 >> 編程語言 >  >> 更多程式語言 >> 程式設計綜合問答

Java 同包不同類中 main 方法創建同名對象:作用域隔離,運行時才分配內存

     編輯:程式設計綜合問答

代碼場景

// Person.java
public class Person {
    public static void main(String[] args) {
        Person person = new Person("張三","學生",20); // 對象變量名 person
        person.display();
    }
}

// TestPerson.java (同包)
public class TestPerson {
    public static void main(String[] args) {
        Person person = new Person("李四","程序員",22); // 同名變量 person
        person.display();
    }
}

核心疑問

「兩個 main 方法裡對象變量名都是 `person`,為什麼能創建成功?是因為存儲位置不一樣嗎?」

答案:編譯期隔離,運行期獨立

  1. 編譯期:`Person.java` 和 `TestPerson.java` 獨立編譯為兩個 `.class` 文件。各自的 `main` 方法內部的局部變量 `person` 作用域**僅限於該方法內部**,編譯器將其視為完全不同的槽位(LocalVariableTable 索引),互不干擾。
  2. 運行期:JVM **只會執行一個入口主類**的 `main` 方法(如 `java TestPerson`)。
      - 若運行 `Person`,只有 `Person.main` 執行,創建一個 `Person` 對象,變量 `person` 指向堆中該對象。
      - 若運行 `TestPerson`,只有 `TestPerson.main` 執行,創建另一個 `Person` 對象,變量 `person` 指向另一塊堆內存。
      - **兩個 `main` 永不同時運行**,不存在「同名衝突」。
  3. 堆內存:每次 `new Person()` 都在堆中分配新對象,由當前執行的 `main` 方法的局部變量表(棧幀)引用。兩次運行屬於兩個獨立 JVM 進程(或同進程不同調用),堆隔離或對象不同。

關鍵概念澄清

概念說明
局部變量作用域方法內部,編譯期確定槽位,運行期棧幀隔離
對象存儲位置堆,`new` 時分配,垃圾回收管理
引用變量棧幀局部變量表中,存儲對象堆地址
程序入口`java 類名` 指定運行哪個 main,單線程單入口

驗證實驗

// 在 Person.main 中添加
System.out.println("Person.main person hash: " + System.identityHashCode(person));

// 在 TestPerson.main 中添加
System.out.println("TestPerson.main person hash: " + System.identityHashCode(person));

// 分別運行:
// java Person  -> 輸出 hash1
// java TestPerson -> 輸出 hash2 (不同)
// 證明:兩次運行創建不同對象,變量名相同無衝突。

總結

同名局部變量在不同方法/類中完全合法,編譯期隔離、運行期互不干擾。Java 無全局變量,所有變量皆有明確作用域。

  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved