传值还是引用

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一份给形参,对于形参的任何改变不会影响实参

如果是对象(包括字符串对象),都是传递的地址,如果对实参做出了改变,那就是有效的.

局部变量和成员变量之类都是保存在内存的栈(stack)中,new出来的都是在堆中(heap),java中没有指针,都是这个其实就是指针.

ex:Peson p = new Person();

p位于栈中,new出来的Person对象在堆中,p记录的是一串类似 于堆中内存地址的东西,就是说可以通过p来访问Persopn对象

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值