基本型と参照型 基本型: 値は、どのように変更しても、現在のスタック フレームの値のみを変更し、メソッドの実行後に外部に変更されることはありません。メソッド; この時点で、アクティブな割り当てを返す必要があります。 参照データ型: ポインタはローカル変数テーブルに格納されます。メソッドが呼び出されると、コピー参照がスタックにプッシュされ、代入によってコピーの参照が変更されるだけです。ただし、コピー参照の値を直接変更して参照アドレスのオブジェクトを変更すると、当然ながらメソッド外でこのアドレスを参照しているオブジェクトも変更されてしまいます。 (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
その理由は、メソッド実行時にスタックフレームの概念があるためです。 、スタックにプッシュされると、Push メソッドのパラメーターのみが、渡されたパラメーターのコピーになります。
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 については、本質的には最終型の 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
参照型は、浅いコピーと深いコピー現象を引き起こします。
関連記事:
PHPクロージャ関数にパラメータを渡し、外部変数、php変数を使用する方法
以上がJava で関数の受信値を変更する: 基本型と参照型の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。