基本型別與參考型別 基本型別:值存放在局部變數表中,無論如何修改只會修改目前堆疊訊框的值,方法執行結束對方法外不會做任何改變;此時需要改變外層的變量,必須傳回主動賦值。 引用資料型態:指標存放在局部變數表中,呼叫方法的時候,副本引用壓棧,賦值只改變副本的參考。但是如果直接改變副本引用的值,修改了引用地址的對象,此時方法以外的引用此地址對象當然被修改。 (兩個引用,同一個位址,任何修改行為2個引用同時生效)
public class Test2 { public static void setValue(String str){ str = "ss"; } public static void setValue(Man str){ str = new Man("test"); } public static class Man{ private String name; public String getName() { return name; } public void setName(String name) { this.name = name; } public Man(String name) { this.name = name; } @Override public String toString() { return "Man{" + "name='" + name + '\'' + '}'; } } public static void main(String[] args) { String str = "s"; setValue(str); System.out.println(str); Man man = null; setValue(man); System.out.println(man); } }
如上面程式碼實踐,結果輸出
s null
原因是方法在執行的時候有堆疊幀的概念,入棧的時候只是壓棧方法參數是傳入參數的副本。
Java高階特性
此時區分資料型別:基本型別與參考型別
基本類型:值存放在局部變數表中,無論如何修改只會修改目前堆疊幀的值,方法執行結束對方法外不會做任何改變;此時需要改變外層的變量,必須傳回主動賦值。
引用資料類型:指標存放在局部變數表中,呼叫方法的時候,副本引用壓棧,賦值僅改變副本的參考。 但是如果直接改變副本引用的值,修改了引用地址的對象,此時方法以外的引用此地址對象當然被修改。 (兩個引用,同一個位址,任何修改行為2個引用同時生效)
例如
public static void setValue(StringBuilder str){ str = new StringBuilder("sss"); } public static void setValue2(StringBuilder str){ str.append("sss"); } public static void main(String[] args) { StringBuilder str = new StringBuilder(); setValue(str); System.out.println(str.toString()); setValue2(str); System.out.println(str.toString()); }
關於String,本質是final類型char數組,不可修改,只能賦值,在做參數傳入方法修改時,其實是新建對象,必須回傳重新對外面的變數賦值才會對外面的String引用生效。
看String原始碼的任一方法即可明白
/** * Returns a string resulting from replacing all occurrences of * {@code oldChar} in this string with {@code newChar}. * <p> * If the character {@code oldChar} does not occur in the * character sequence represented by this {@code String} object, * then a reference to this {@code String} object is returned. * Otherwise, a {@code String} object is returned that * represents a character sequence identical to the character sequence * represented by this {@code String} object, except that every * occurrence of {@code oldChar} is replaced by an occurrence * of {@code newChar}. * <p> * Examples: * <blockquote><pre class="brush:php;toolbar:false"> * "mesquite in your cellar".replace('e', 'o') * returns "mosquito in your collar" * "the war of baronets".replace('r', 'y') * returns "the way of bayonets" * "sparring with a purple porpoise".replace('p', 't') * returns "starring with a turtle tortoise" * "JonL".replace('q', 'x') returns "JonL" (no change) ** * @param oldChar the old character. * @param newChar the new character. * @return a string derived from this string by replacing every * occurrence of {@code oldChar} with {@code newChar}. */ public String replace(char oldChar, char newChar) { if (oldChar != newChar) { int len = value.length; int i = -1; char[] val = value; /* avoid getfield opcode */ while (++i
#引用型別會造成淺拷貝和深拷貝現象。
相關文章:
以上是Java 中修改函數傳入值:基本型別與參考型別的詳細內容。更多資訊請關注PHP中文網其他相關文章!