java是值传递,还是引用传递?
原文地址:http://blog.csdn.net/zxmzfbdc/article/details/5401960
java到底是值传递,还是引用传递?以前国内的java开发者有过很多争论,由于《Practical java》等书籍的引入,现在大家都知道java是严格的值传递,基本数据类型不会有什么问题,但是针对对象和数组,执行的结果,似乎应该是引用传递。
在《Practical java》中,给出了说明,针对对象和数组,事实上,传递的内容,是引用的值,而不是引用本身。但是怎么验证,网上没有例子,书上也没有给,现在给出一个 例子,可以很好的说明,java确实是值传递。例子如下:
- public class Test{
- public void c(Model m1, Model m2){
- Model m = m1;
- m1 = m2;
- m2 = m;
- }
- public void cd(int[] a, int[] b){
- int[] c = a;
- a = b;
- b =c;
- }
- public static void main(String[] args){
- Model m1 = new Model();
- m1.setName("m1");
- Model m2 = new Model();
- m2.setName("m2");
- Test app = new Test();
- app.c(m1, m2);
- System.out.println(m1.getName()+"---" + m2.getName());
- int[] a = new int[]{1};
- int[] b = new int[]{2};
- app.cd(a, b);
- System.out.println(a[0] + "----" + b[0]);
- }
- }
- class Model{
- private String name;
- public void setName(String name){
- this.name = name;
- }
- public String getName(){
- return name;
- }
- }
打印的结果是
- D:/ > java Test
- m1---m2
- 1----2
这是因为,m1和m2本身是对象的引用没错,但是传入方法c的参数,实际上是m1和m2的副本,因此只是两个副本进行了交换,而m1和m2本身并没有被交 换。交换数组的方法cd,原理与之相同。