黑马程序员技术交流社区

标题: java传值 [打印本页]

作者: 百里青山    时间: 2016-4-8 11:57
标题: java传值
在学习语言时,我们总是找着另一种相似的语言来对比学习这一门语言,例如:C++与Java。
-------------------------------------------------------------------------------------------------------------------------------------------------------------------------------
Java参数传递到底是进行值传递,还是引用传递呢?
如果用如下定义两者;
  值调用(call by value) 在参数传递过程中,形参和实参占用了两个完全不同的内存空间。形参所存储的内容是实参存储内容的一份拷贝。
引用调用(call by reference) : 在参数传递的过程中,形参和实参完全是同一块内存空间,两者不分彼此
那么参数传递时就是值传递。
例:  
package com.wang;

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);
}
}

输出的结果为:周吴郑  赵钱孙
                         赵钱孙  周吴郑


      person1和person2并没有改变;
若采用如下方式:
package com.wang;

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);
}

}

输出的结果则为:周吴郑  赵钱孙
                            周吴郑  赵钱孙
证明了对象传递只是实参的地址的拷贝;操作传入对象内部的属性才会引起外部实参状态的改变
若不想改变外部的实参状态,那就用克隆 Person p3=(Person)  person1.clone();
此方法会克隆下person1的属性,但若person属性中还有另一个对象;则依次进行深克隆;






欢迎光临 黑马程序员技术交流社区 (http://bbs.itheima.com/) 黑马程序员IT技术论坛 X3.2