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

Java 面試經典題:方法參數傳遞機制與基本類型 vs 引用類型行為差異

     編輯:程式設計綜合問答

面試高頻題:


P1 = V1;
P2 = V2;
method(P1, P2) {
    P1 = V3;
    P2 = V4;
}
// 結果:P1 = V1; P2 = V4;

問:P1、P2 是什麼類型時會出現這種情況?

核心結論

P1 是基本類型,P2 是引用類型(且方法內修改了 P2 所指對象的內部狀態,而非重新賦值 P2 本身)。

詳細解析

Java 參數傳遞:只有「值傳遞」

  • 基本類型:傳遞值的副本,方法內修改不影響外部變量。
  • 引用類型:傳遞引用的副本(即地址值),方法內:
    • 重新賦值參數 (param = new Object()) → 不影響外部引用。
    • 調用參數方法修改對象內部狀態 (param.setXxx(), param.add()) → 影響外部對象。

代碼驗證

public class ParamPassingDemo {
    public static void main(String[] args) {
        // 基本類型
        int p1 = 1; // V1
        // 引用類型:StringBuilder (可變對象)
        StringBuilder p2 = new StringBuilder("V2"); 
        
        method(p1, p2);
        
        System.out.println("p1 = " + p1); // 輸出 1 (V1) - 未改變
        System.out.println("p2 = " + p2); // 輸出 V2V4 - 內部狀態被修改
    }
    
    static void method(int p1, StringBuilder p2) {
        p1 = 3;           // 修改副本,外部無影響
        p2.append("V4");  // 修改對象內部狀態,外部可見!
        // p2 = new StringBuilder("V4"); // 若這樣寫,外部 p2 不變
    }
}

題目條件拆解

變量題目現象推斷類型關鍵操作
P1方法後保持 V1 不變基本類型 (int, long, boolean 等)方法內賦值 P1 = V3 只改副本
P2方法後變為 V4引用類型且為可變對象 (StringBuilder, List, Map, 自定義類)方法內調用修改狀態方法 (如 append, add, setXxx)

特殊情況:String、Integer 等不可變包裝類


String p2 = "V2";
method(p2);
// 方法內 p2 = "V4" 或 p2 += "V4" 都會創建新對象,外部 p2 仍為 "V2"
// 所以 String 不會出現題目現象

面試加分回答模板

  1. 定性:Java 只有值傳遞,無引用傳遞。
  2. 區分:基本類型傳值副本;引用類型傳引用副本(地址)。
  3. 關鍵:引用類型參數重新賦值不影響外部,修改對象內部狀態影響外部。
  4. 結論:P1 為基本類型;P2 為可變引用類型,且方法內調用了修改其內部狀態的方法。
  5. 舉例:int vs StringBuilder/ArrayList/自定義 Bean。

延伸思考

  • 如何在方法中修改外部基本類型變量? → 傳入包裝類數組 int[] 或 AtomicInteger,或返回新值賦值。
  • 如何設計 API 避免副作用? → 參數用不可變類型、返回新對象而非修改輸入、文檔標註「不修改輸入」。

這道題考察的不是語法,而是對內存模型(棧/堆)與參數傳遞本質的理解,是區分初中級 Java 開發者的分水嶺。

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