一个实例介绍——java中的参数传递(传值、传引用)

java的学习之路总是不平坦的,最近被java中函数参数的传递搞得有点糊涂了,所以经过查资料,现在总结一下自己的理解。下面这个例子不一定是那么有代表性,但是我个人觉得还是能说明一些问题。在这里的总结只是想让后面的人少走一些弯路,共同学习。

  • 首先,看一行代码:Human man = new Human();相信学过C/C++的人可能会误以为man是一个对象,反正我一开始是这么觉得的,原来man只是一个对象的引用,对象的创建是用new Human()实现的。
  • 然后,java中调用一个函数,参数间有一个拷贝动作(值的拷贝、对象引用的拷贝),本人刚看到是引用时,还以为和C++中的一样没有拷贝动作呢。
  • 最后,关于概念上的传值、传引用,个人觉得不需要去纠结那么多,也可以全部理解成传值(这一点和C/C++里的理解是一样的地址也可以看作是值)。
下面看一个简单的例子:
package calculate;

class Test{
	int val1;
	int val2;
	Test(int i1, int i2){
		val1 = i1;
		val2 = i2;
	}
}

public class Demo {
	
	Test test1;
	Test test2;
	
	public static void main(String[] args) {
		
		Demo demo = new Demo();
		demo.test1 = new Test(1, 2);
		demo.test2 = new Test(3, 4);
		
		int i1 = 5;
		int i2 = 6;
		
		System.out.println("初始值如下:");
		System.out.println("demo.test1 = " + demo.test1.val1 + ", " + demo.test1.val2);
		System.out.println("demo.test2 = " + demo.test2.val1 + ", " + demo.test2.val2);
		System.out.println("i1 = " + i1);
		System.out.println("i2 = " + i2);
		
		System.out.println("测试如下:");
		System.out.println("传值函数(1种情况)");
		demo.fun1(i1, i2);
		System.out.println("i1 = " + i1);
		System.out.println("i2 = " + i2);
		System.out.println("传引用函数(2种情况)");
		System.out.println("1、交换两个对象引用");
		demo.fun2(demo.test1, demo.test2);
		System.out.println("demo.test1 = " + demo.test1.val1 + ", " + demo.test1.val2);
		System.out.println("demo.test2 = " + demo.test2.val1 + ", " + demo.test2.val2);
		System.out.println("1、修改对象引用的属性");
		demo.fun3(demo.test1, demo.test2);
		System.out.println("demo.test1 = " + demo.test1.val1 + ", " + demo.test1.val2);
		System.out.println("demo.test2 = " + demo.test2.val1 + ", " + demo.test2.val2);
	}
	
	void fun1(int int1, int int2){
		int1 = 4;
		int2 = 3;
	}
	
	void fun2(Test t1, Test t2){
		Test temp;
		temp = t1;
		t2 = t1;
		t2 = temp;
	}	
	
	void fun3(Test t1, Test t2){
		t1.val1 = 0;
		t1.val2 = 0;
		t2.val1 = 0;
		t2.val2 = 0;
	}	

}
结果如下所示:

这里说说本人的理解,第一个函数和C/C++中的差不多,是值的一份拷贝,所以对形参的修改并不能对实参进行改变;第二个函数,t1和t2分别是demo.test1和demo.test2的一份拷贝,此时它们分别和它们的拷贝指向同一个对象,但是对对象引用的修改(这里是修改了t1和t2指向的对象)并不会影响实参;第三个函数和第二个函数差不多,不过第三个函数内部是分别修改了t1和t2指向的对象属性,所以demo.test1和demo.test2也跟着一起修改了,因为它们都是指向同一个对象。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值