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プロパティに別のオブジェクトがある場合は、順に深いクローンを作成します.
 
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);
 }
}

結果:
周呉鄭銭孫周呉鄭銭孫