您的位置:首页 > 编程语言 > Java开发

JAVA中函数调用参数传递的理解(值传递和引用传递的理解)

2016-06-26 16:47 621 查看

个人理解: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类
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: