JAva値転送と参照転送
1681 ワード
値呼び出し(call by value):パラメータ伝達中に、パラメータと実パラメータがまったく異なる2つのメモリ領域を占有します.パラメータが格納するコンテンツは、実パラメータが格納するコンテンツのコピーであり、元の値には影響しません.
リファレンスコール(call by reference):パラメータの転送中に、パラメータと実パラメータは完全に同じメモリ空間であり、両者を区別せずに元の値に影響します(配列転送はリファレンスコールです)
一般的にオブジェクトはString以外は参照です.
結論1:
オブジェクト転送(String,int,ただしString,intは値呼び出しであり,元の値には影響しない)は実パラメータのアドレスのコピーにすぎない.外部の実パラメトリック状態を変更するには、オブジェクトの内部に入力されたプロパティを操作します.
外部の実パラメトリック状態を変更したくない場合は、Person p 3=(Person)person 1をクローンする.clone();
このメソッドでは、person 1のプロパティがクローン化されますが、personプロパティに別のオブジェクトがある場合は、順に深いクローンを作成します.
結果:
周呉鄭趙銭孫趙銭孫周呉鄭
person 1とperson 2は変わっていません.
ただし:
結果:
周呉鄭銭孫周呉鄭銭孫
リファレンスコール(call by reference):パラメータの転送中に、パラメータと実パラメータは完全に同じメモリ空間であり、両者を区別せずに元の値に影響します(配列転送はリファレンスコールです)
一般的にオブジェクトはString以外は参照です.
結論1:
オブジェクト転送(String,int,ただしString,intは値呼び出しであり,元の値には影響しない)は実パラメータのアドレスのコピーにすぎない.外部の実パラメトリック状態を変更するには、オブジェクトの内部に入力されたプロパティを操作します.
外部の実パラメトリック状態を変更したくない場合は、Person p 3=(Person)person 1をクローンする.clone();
このメソッドでは、person 1のプロパティがクローン化されますが、personプロパティに別のオブジェクトがある場合は、順に深いクローンを作成します.
public class Person {
public String name;
public Person(String name) {
this.name = name;
}
public static void swap(Person p1, Person p2) {
Person temp = p1;
p1 = p2;
p2 = temp;
System.out.println(p1.name + " " + p2.name);
}
public static void main(String[] args) {
Person person1 = new Person(" ");
Person person2 = new Person(" ");
swap(person1, person2);
System.out.println(person1.name + " " + person2.name);
}
}
結果:
周呉鄭趙銭孫趙銭孫周呉鄭
person 1とperson 2は変わっていません.
ただし:
public class Person {
public String name;
public Person(String name) {
this.name = name;
}
public static void swap(Person p1, Person p2) {
String temp = p1.name;
p1.name = p2.name;
p2.name = temp;
System.out.println(p1.name + " " + p2.name);
}
public static void main(String[] args) {
Person person1 = new Person(" ");
Person person2 = new Person(" ");
swap(person1, person2);
System.out.println(person1.name + " " + person2.name);
}
}
結果:
周呉鄭銭孫周呉鄭銭孫