在学习java的传递机制时遇到的问题,需求是交换两个数值位置,关于结果甚是不解
第一种情况:当方法交换两个形参后,上下都输出值不同
int m = 10;
int n = 20;
ValueTrans test = new ValueTrans();
test.swap(m,n);
System.out.println(m+","+n);//20,10
}
public void swap(int i, int j){
int temp = i;
i = j;
j = temp;
System.out.println(i+","+j);//10,20
}
第二种情况:当只显示方法时,输出的结果对的
int m = 10;
int n = 20;
ValueTrans test = new ValueTrans();
test.swap(m,n);
}
public void swap(int i, int j){
int temp = i;
i = j;
j = temp;
System.out.println(i+","+j);//20,10
}
第三种情况:当只显示对象调用结果时,输出的结果是错的
int m = 10;
int n = 20;
ValueTrans test = new ValueTrans();
test.swap(m,n);
System.out.println(m+","+n);//10,20
}
public void swap(int i, int j){
int temp = i;
i = j;
j = temp;
}
这三种情况分别该如何理解呢?
Java 中是值传递,基本数据类型传递的是数据值,此时入参就是(20,10)在swap方法内修改是不会影响到外面的值。 但是如果是对象则是引用值,也就是对象的内存地址,如果在方法内部修改对象的属性,在方法外也是同步修改的;这是因为内存地址没有发生改变,获取的对象都是同一个对象
这就是一种情况呀,值传递,里面的i和j只是复制了m和n的值,你怎么改i和j,对外面的m、n都不会有影响。
这不是一种情况吗, 哪来的三种,我怀疑是你打印顺序看错了,你打印语句加一下标志,分区以下看看
System.out.println("1:"+m+","+n);
System.out.println("2:"+i+","+j);
好好看一下值是多少,m和n是不变的,swap内的ij会交换
java没有指针,函数里的交换相当于拷贝一份数据,进行交换,不会影响主函数里的数据
引用类型比如数组等,函数里的交换和主函数情况一致