先下定论:java中所有的参数传递都是值传递。
通过以下问题来慢慢理解
为什么值传递也可以改变传入参数的值?
知道java基本知识的同学都知道这样一句话“java中除了基本类型是值传递外,其它类型对象都是引用传递”;其实其它类型对象传递的也是值,只是这个值是存储对象的地址而已,所以当然可以通过这个值改变原对象的值。通过下面的C++代码可能更好理解:
-
#include <iostream>
-
using namespace std;
-
-
void swap1(int *p,int *q){
-
int *t =p;
-
p = q;
-
q=t;
-
}
-
void swap2(int &p,int &q){
-
int t = p;
-
p=q;
-
q=t;
-
}
-
void swap3(int *p,int *q){
-
int t = *p;
-
*p = *q;
-
*q= t;
-
}
-
-
int main() {
-
int a=3;
-
int b=4;
-
cout<<"before swap a:"<<a<<"b:"<<b<<endl;
-
cout<<"a ptr:"<<&a<<endl;
-
//swap1(&a,&b);
-
//swap2(a,b);
-
swap3(&a,&b);
-
cout<<"after swap a:"<<a<<"b:"<<b<<endl;
-
return 0;
-
}
显而易见只有swap2和swap3改变原对象的值。swap1虽然也是传递的地址,但是它是改变的地址值,而不是地址对应对象的值。所有不能实现效果,swap3是在此基础上对地址对应的对象的修改,所有可以实现效果。
再来看下下面的java代码:
-
public class SwapTest {
-
-
public static void main(String []args){
-
Data d1 = new Data(3);
-
Data d2 = new Data(4);
-
System.out.println("before swap d1:"+d1+"d2:"+d2);
-
Swap.swap1(d1,d2);
-
Swap.swap2(d1, d2);
-
System.out.println("after swap d1:"+d1+"d2:"+d2);
-
}
-
-
}
-
-
class Swap{
-
public static void swap1(Data left,Data right){
-
int t= right.a;
-
right.a = left.a;
-
left.a = t;
-
}
-
public static void swap2(Data left,Data right){
-
left = new Data(4);
-
right = new Data(3);
-
}
-
-
}
-
-
class Data{
-
public int a;
-
public Data(int a){
-
this.a = a ;
-
}
-
-
@Override
-
public String toString() {
-
// TODO Auto-generated method stub
-
return ""+a;
-
}
-
-
}
这里体会下swap1可以实现效果,swap2不能实现效果。这里可以参考: http://www.cnblogs.com/foreach-break/p/call-by-reference-OR-call-by-value.html
帮助对这里的理解。
http://m.blog.csdn.net/article/details?id=49047217 这篇文章写的也不错
阅读(814) | 评论(0) | 转发(0) |