个人理解:JAVA语言总是按照值传递调用的,基本上所有的函数调用参数传递都是值传递。其实参数为对象的传递也是值传递,只是对象本身也是对堆区真实对象的引用,所以对象参数传递的结果是对象的引用的值拷贝(可以参照C++的指针去理解)。
(以上是我截至到目前我对JAVA值传递和引用传递的理解)。
下面做一系列测试验证我的理解:
首先我定义一个要测试的类,考虑到深度拷贝,加上了clone的接口:
public class CloneClass implements Cloneable{
private int a;
private int b;
public CloneClass(){
this.a=10;
this.b=5;
}
public int getA() {
return a;
}
public void setA(int a) {
this.a = a;
}
public int getB() {
return b;
}
public void setB(int b) {
this.b = b;
}
@Override
protected Object clone() throws CloneNotSupportedException {
// TODO Auto-generated method stub
return super.clone();
}
}
1.基本数据类型作为参数的传递
测试代码:
public static void main(String[] args) {
// TODO Auto-generated method stub
/**
* 1.测试值传递,JAVA中方法调用值,除了基本的数据类型int,char,boolean,long等为值传递调用,其余的对象传递其实也是值传递,只是对象的值是一个引用
*/
CloneClass c1=new CloneClass();
System.out.println("c1:b的值为:"+c1.getB());
TestClone.testZhiChuan(c1.getB());
System.out.println("c1: b的值为:"+c1.getB());
}
//测试基本类型的值传递
public static void testZhiChuan(int b){
b=100;
}
结果:
上面代码可以看出c1中的b的值并没有改变,所以基本数据类型是值传递
2.对象作为参数的传递
测试代码:
public static void main(String[] args){
/**
* 2.对象的传递
*/
CloneClass c2=new CloneClass();
System.out.println("c2:a的值为:"+c2.getA());
TestClone.testYinyong(c2);
System.out.println("c2: a的值为:"+c2.getA());
}
//测试对象的值传递:拷贝的值为一个引用
public static void testYinyong(CloneClass cloneClass){
cloneClass.setA(20);
}
结果:
在这里我们看到的结果的的确确变成了类似于引用传递的效果,好多JAVA开发成员也把这种传递叫引用传递,实际上这种也是一种值传递。
3.对象克隆(深拷贝)
如何解决对象传参修改属性值的问题?
使用对象克隆!!
/**
* @param args
*/
public static void main(String[] args) throws CloneNotSupportedException{
// TODO Auto-generated method stub
/**
* 3.对象克隆解决修改对象值问题
*/
CloneClass c3=new CloneClass();
System.out.println(c3);
System.out.println("c3:a的值为:"+c3.getA());
TestClone.testClone(c3);
System.out.println("c3: a的值为:"+c3.getA());
}
//测试对象的深度拷贝,克隆的使用
public static void testClone(CloneClass cloneClass) throws CloneNotSupportedException{
System.out.println(cloneClass);
CloneClass testClone=(CloneClass)cloneClass.clone();
System.out.println(testClone);
testClone.setA(20);
System.out.println("testClone a:"+testClone.getA());
}
写法建CloneClass类