値を渡すか参照するか

2622 ワード

public class A
{
  public static void main(String args[]){
    Person p1 = new Person("zhangshan",28);
    Person p2 = new Person("lisi",27);
    A a = new A();
    a.changeObj(p1, p2);
    System.out.println(p1.name + "__" + p2.name);

    a.changeObj2(p1);
    System.out.println(p1.name);

    a.changeObj3(p2);
    System.out.println(p2.name);

    StringBuffer sb1 = new StringBuffer("s11111");
    StringBuffer sb2 = new StringBuffer("s22222");
    a.changeSB(sb1, sb2);
    System.out.println(sb1 + "__" + sb2);

    int x = 10;
    int y = 100;
    a.changeInt(x, y);
    System.out.println(x + "__" + y);  // ,copy 

    String s1 = "s1";
    String s2 = "s2";
    a.changeString(s1, s2);
    System.out.println(s1 + "___" + s2);

  }

  public void changeObj(Person p1, Person p2){
    Person temp = new Person("",0);
    temp = p1;
    p1 = p2;
    p2 = temp;
  }

  public void changeObj2(Person p){
      p.setName("test"); //changed
  }

  public void changeObj3(Person p){
      p = new Person("test", 12); //no change ,p new , p2
  }

  public void changeSB(StringBuffer sb_1, StringBuffer sb_2){  // 
      sb_1.append("+appended"); //sb_1 sb1 
      sb_2 = sb_1;               //sb_2 , sb1,sb_2 , sb2
  }

  public void changeInt(int a, int b){
      int temp;
      temp = a;
      a = b;
      b = temp;
  }

  public void changeString(String s_1, String s_2){
      String temp;
      temp = s_1;
      s_1 = s_2;
      s_2 = temp;
  }
}


class Person
{
    public String name;
    public int age;

    public Person(String name, int age){
        this.name = name;
        this.age = age;
    }

    public void setName(String name){
        this.name = name;
    }
}

 
 
大体javaの基本データ型では、値伝達、すなわち実パラメータcopyが形パラメータに1部与えられ、形パラメータの変更には実パラメータに影響しません.
オブジェクト(文字列オブジェクトを含む)が伝達するアドレスである、実パラメータを変更すれば有効である.
ローカル変数やメンバー変数などはメモリのスタックに保存されており、newが出てくるのはスタックにあり、javaにはポインタがなく、これがポインタである.
ex:Peson p = new Person();
pはスタックの中にあり、newから出てきたPersonオブジェクトはスタックの中にあり、pはスタックの中のメモリアドレスに似たものを記録している.つまり、pを通じてPersopnオブジェクトにアクセスできるということだ.