JavaはCallBy Value?Call By Reference?
JavaはCallByvalue?Call By Reference?
以下に示すように、name propertyを持つPersonクラスを定義します.
class Person {
private String name;
public Person(String name) {
this.name = name;
}
public void setName(String name) {
this.name = name;
}
public String getName() {
return name;
}
}
参照先の変更
まず,Person型参照変数参照のターゲットを変更する.
public class Main {
public static void changePerson(Person param) {
param = new Person("new Person");
}
public static void main(String[] args) {
Person person = new Person("before");
System.out.println("메서드 호출 전 " + person.getName());
changePerson(person);
System.out.println("메서드 호출 후 " + person.getName());
}
}
予想される実行結果は、person変数が参照するオブジェクトをnewpersonに変更する必要があります.以下に示します.메소드 호출 전 before
메소드 호출 후 new person
ただし、実際の実行結果は以下のようになり、person変数が参照するターゲットは変わりません.메소드 호출 전 before
메소드 호출 후 before
参照先の属性の置換
では、参照するターゲットのproperty(すなわちname値)を変更するのはどうでしょうか.
public class Main {
public static void changePerson(Person param) {
// param = new Person("new Person");
param.setName("new Person");
}
public static void main(String[] args) {
Person person = new Person("before");
System.out.println("메서드 호출 전 " + person.getName());
changePerson(person);
System.out.println("메서드 호출 후 " + person.getName());
}
}
class Person {
private String name;
public Person(String name) {
this.name = name;
}
public void setName(String name) {
this.name = name;
}
public String getName() {
return name;
}
}
実行結果메서드 호출 전 before
메서드 호출 후 new person
nameの値が変化していることが確認できます.changePersonメソッドのパラメータparamと主関数で宣言されたpersonは同じインスタンス(before)を指すが、paramとpersonは独立した変数であると決定できる.すなわち,chagnePersonメソッドが実行されると,personの参照値がコピーされparamのCall By Valueに渡される.
Reference
この問題について(JavaはCallBy Value?Call By Reference?), 我々は、より多くの情報をここで見つけました https://velog.io/@blessing333/Java는-Call-By-Value-Call-By-Referenceテキストは自由に共有またはコピーできます。ただし、このドキュメントのURLは参考URLとして残しておいてください。
Collection and Share based on the CC Protocol