メソッドを呼び出すときにデータを仮パラメータに渡すプロセスは、パラメータの受け渡しと呼ばれます。プログラミング言語には、値による転送と参照による転送という 2 つの転送モードがあります。ここで述べた 2 つの転送メソッドは Java で使用される転送メソッドに限定されるものではなく、Java を含む多くのプログラミング言語で登場する転送メソッドであることを強調しておく必要があります。
2. 変数の型2 価値の受け渡し
2. 元の変数
public void change(int b) { b = 7; } @Testpublic void testBasic() {int a = 9; change(a); System.out.println(a); }
パラメータが渡されると、値の受け渡しのルールに従って、変数 b はリテラルを指す a のコピーを受け取ります。 value "9":
次に、メソッド内で、b が 7 を指すように、値 7 を b に代入します。 a と b は 2 つの独立変数であるため、参照はありません。それらの間の -reference 関係は、まだ 9 を指します:
3.String
public void change(String str01) { str01 = "baidu"; } @Testpublic void testString() { String str = new String("www.baidu.com"); change(str); System.out.println(str); }
パラメータが渡されると、str自身のコピーを str01 に渡し、 str01 がヒープに「www.baidu.com」を格納しているオブジェクトも指すようにします。メソッド領域の文字列定数プールの「baidu」を指す場合でも、str はヒープ内の「www.baidu.com」を指します。str と str01 は異なるオブジェクトを指し、相互に影響しません。
ここで注意すべき点が 1 つあります。Java は String を不変オブジェクトになるように設計しています。つまり、String オブジェクトに含まれるリテラル値が変更されると、Java は新しいオブジェクトを作成し、変数がその新しいオブジェクトを指すようにします。
4.StringBuilder
public void change(StringBuilder builder01) { builder01.append(" World!"); } @Testpublic void testStringBuilder() { StringBuilder builder = new StringBuilder("Hello"); change(builder); System.out.println(builder); }
実際の出力: Hello World!
パラメータ転送が完了すると、builder01 変数はビルダー変数のコピーを取得し、そのコピーと元の変数ポイントを取得します。ヒープ内の同じオブジェクトに:
5. カスタムタイプ
public class MyInner {public int a; }public class Test{public void change(MyInner in01) { in01.a = 1; } @Testpublic void testDemain() { MyInner in = new MyInner(); in.a = 9; change(in); System.out.println(in.a); } }実際の出力: 1
実行プロセスは StringBuilder の実行プロセスと同じなので、勝ちましたここでは詳細には触れません。上記のコードに次のようにいくつかの変更を加えてみましょう:
实际输出:9 参数传递完成时,in01与in指向同一个对象,in01对对象的操作等同于in对对象的操作,接着在方法内部执行"in01=new MyInner();",这样in01就指向了一个新的对象,in01所有的操作都与in无关了: 综合以上的运行结果与分析,可知java参数传递方式符合值传递。 将变量自身的内存地址传入方法中,方法中的变量指向方法外的变量,在方法中对变量的操作就是对方法外变量的操作。 实际输出:9 如果采用引用传递,传递完成以后,in01指向in,对in01的操作就是对in的操作,in01指向对象2,那么in也指向对象2,输出1,与实际不符,所以不是采用引用传递。
不再一一分析其他变量类型,分析后可以发现,java在传递参数时采用的不是引用传递,而是值传递。 简单讲,值传递时方法内外是两个拥有同一指向的变量,引用传递时方法内外是同一个变量。public class MyInner {public int a;
}public class Test{public void change(MyInner in01) {
in01=new MyInner();//使in01指向一个新的对象in01.a = 1;
}
@Testpublic void testDemain() {
MyInner in = new MyInner();
in.a = 9;
change(in);
System.out.println(in.a);
}
}
三 引用传递
1.什么是引用传递?
2.自定义类型
public class MyInner {public int a;
}public class Test{public void change(MyInner in01) {
in01=new MyInner();//使in01指向一个新的对象in01.a = 1;
}
@Testpublic void testDemain() {
MyInner in = new MyInner();
in.a = 9;
change(in);
System.out.println(in.a);
}
}
以上がパラメータの受け渡しとは何ですか?彼の用途は何でしょうか?の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。