关于Java交换两个对象的问题

关于Java交换两个对象的问题

 

        对于C++比较熟悉的童鞋,应该知道在函数传参时,有传值、传地址(指针)和传引用这3种。众所周知,Java中没有指针,所以只有传值和传引用两种。

        很容易理解,Java的基本类型,例如int、float等,都是传值。而对象采用传引用,因为对象如果采用传值的话,要复制一份对象中的所有数据,这个开销太大了,实现起来也很麻烦(学过C++的,就知道要实现复制构造函数、重载赋值运算符等,总之很麻烦)。

        近日,浏览了网上关于传引用还是传值的问题,参见后面的参考资料。于是,记下自己的理解。以下面的Java代码为例。

public class Test {
	
	public String str;
	
	public Test(String str) {
		this.str = str;
	}

	public static void swapString(String a, String b) {
		String t = a;
		a = b;
		b = t;
		
		System.out.println("In swapString: " + a + " " + b);
	}
	
	public static void swapObject(Test t1, Test t2) {
		Test temp = t2;
		t2 = t1;
		t1 = temp;
		
		System.out.println("In swapObject: " + t1.str + " " + t2.str);
	}
	
	public static void changeObject(Test t) {
		t.str = "No";
	}
	
	public static Test modifyObject(Test t) {
		t.str = "Bad";
		
		return t;
	}
	
	public static void main(String[] args) {
		
		// Try to swap two strings
		String str1 = "Hello";
		String str2 = "World";
		swapString(str1, str2);
		System.out.println("After: " + str1 + " " + str2);
		
		// Try to swap two objects
		Test test1 = new Test("Hello");
		Test test2 = new Test("World");
		swapObject(test1, test2);
		System.out.println("After: " + test1.str + " " + test2.str);
		
		// Try to change an object's field
		Test test3 = new Test("Yes");
		changeObject(test3);
		System.out.println(test3.str);
		
		// Try to modify an object's field
		Test test4 = new Test("Good");
		Test test5 = modifyObject(test4);
		System.out.println(test4.str);
		System.out.println(test5.str);
	}
}

输出结果:

In swapString: World Hello
After: Hello World
In swapObject: World Hello
After: Hello World
No
Bad
Bad

        很明显,两个swap方法(swapString和swapObject)都没有成功,而changeObject和modifyObject方法都改变了对象中的字段(field)。但是,注意在swapString和swapObject方法,交换是成功的。这说明通过引用可以修改对象中的字段,但是方法中可以交换两个形参的引用,但是实际上改变不了实参的引用。

        借这个例子,我想说的是,“Java中对象是按引用传的,但是传的是引用的值”。这句话不好理解,我用下面的C代码解释。

#include <stdio.h>

void swap(int* a, int* b)
{
	int *t = b;
	b = a;
	a = t;
	printf("In swap: %d %d\n", *a, *b);
}

void main(void)
{
	int a = 1;
	int b = 2;
	swap(&a, &b);
	printf("%d %d\n", a, b);
}

输出结果:

In swap: 2 1
1 2

        这个C代码的swap和上面Java代码的swap,实质上是一样的,交换的都是指针的值,而不是指针指向对象!(Java封装了指针,只是看不了而已)。

        以上是个人理解,仅供参考。

 

参考资料:

1、http://blog.csdn.net/fbysss/article/details/3082949

2、http://fuliang.iteye.com/blog/69313

  • 6
    点赞
  • 16
    收藏
    觉得还不错? 一键收藏
  • 6
    评论
评论 6
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值