簡體   English   中英

將params傳遞給Java中的方法

[英]Passing params to methods in Java

我對一件簡單的事情感到困惑 - 將參數傳遞給方法並更改它們的值......我最好給你一些代碼:

public class Test {
  public static void main(String[] args) {
    Integer val = new Integer(41);
    upd(val);
    System.out.println(val);

    Man man = new Man();
    updMan(man);
    System.out.println(man.name);
  }

  static void upd(Integer val) {
    val = new Integer(42);
  }

  static void updMan(Man man) {
    man.name = "Name";
  }

  static class Man {
    String name;
  }
}

你能解釋一下為什么我傳給的Integer對象在Man對象時沒有更新嗎? 是不是通過引用傳遞的Integer和Man對象(由於它們的非原始性質)?

因為對於Integer您正在創建一個新對象。 對於Man你只需更改其中一個值,對象man保持不變。

考慮以下:

static void updMan(Man man) {
  man = new Man();
  man.name = "Another Man";
}

這也不會改變你的初始man

- 編輯

您可以通過以下方式“模擬” Integer的可變性:

static void upd(Integer val) {
    try {
        Field declaredField = val.getClass().getDeclaredField("value");
        declaredField.setAccessible(true);
        declaredField.set(val, 42);
    } catch (Exception e) {
    }
}

它被稱為Pass by value 當您將一些對象傳遞給dome方法時,Java會創建對該對象的引用副本。 如果在進入方法體后立即檢查對象的哈希碼,它將與傳遞的對象的哈希碼相同。 但是當你在方法中更改它時,對象更改和引用不再指向同一個對象。

編輯 :代碼示例

public class TestPass {

    public static void main(String[] args) {
        String ss= "sample";
        System.out.println("Outside method: "+ss.hashCode());
        method(ss);

    }

    static void method(String s){
        System.out.println("Inside method: "+s.hashCode());
        s+='!';
        System.out.println("Inside method after object change: "+s.hashCode());
    }

}

輸出:

Outside method: -909675094
Inside method: -909675094
Inside method after change: 1864843191

作為參數在Java中的對象通過引用副本作為參數傳輸 - 因此,如果您通過引用副本更改對象 - 您將更新對象。

如果使用upd(Integer val)方法,則創建一個新的Integer對象,以便引用副本現在指向一個新對象,而不是舊對象。 因此,更改該對象不會影響原始對象。

man.name = "Name"; 

實際上,您正在更改同一對象中的某些內容,而不是像在整數情況下那樣創建新對象。

暫無
暫無

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

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