A股上市公司传智教育(股票代码 003032)旗下技术交流社区北京昌平校区

 找回密码
 加入黑马

QQ登录

只需一步,快速开始

© 百里青山 高级黑马   /  2016-4-8 11:57  /  253 人查看  /  0 人回复  /   0 人收藏 转载请遵从CC协议 禁止商业使用本文

在学习语言时,我们总是找着另一种相似的语言来对比学习这一门语言,例如: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属性中还有另一个对象;则依次进行深克隆;

0 个回复

您需要登录后才可以回帖 登录 | 加入黑马