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

个人理解: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类

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值