黑马程序员技术交流社区
标题:
java 对象,引用,对象赋值
[打印本页]
作者:
陈振宇
时间:
2014-4-5 10:14
标题:
java 对象,引用,对象赋值
1.对象,引用
StringBuffer s;
s = new StringBuffer("Java");
StringBuffer s1 = s;//将s所指向的对象赋给s1
s1.append(" World");将“world”赋值给s1所指向的对象,注意是对s1所指向的对象的操作
System.out.println("s1=" + s1.toString());//打印结果为:s1=Java World
System.out.println("s=" + s.toString());//打印结果为:s=Java World
上面的程序表明,s1和s打印出来的内容是一样的,这样的结果看起来让人非常疑惑,但是仔细想想,s1和s只是两个引用,它们只是操纵杆而已,它们指向同一个对象,操纵的也是同一个对象,通过它们得到的是同一个对象的内容。
2.
般来说,对于基本类型的传递,我们很容易理解,而对于对象,总让人感觉是按引用传递,看下面的程序:
public class ObjectRef {
//基本类型的参数传递
public static void testBasicType(int m) {
System.out.println("m=" + m);//m=50
m = 100;
System.out.println("m=" + m);//m=100
}
//参数为对象,不改变引用的值 ??????
public static void add(StringBuffer s) {
s.append("_add");
}
//参数为对象,改变引用的值 ?????
public static void changeRef(StringBuffer s) {
s = new StringBuffer("Java");
}
public static void main(String[] args) {
int i = 50;
testBasicType(i);
System.out.println(i);//i=50
StringBuffer sMain = new StringBuffer("init");
System.out.println("sMain=" + sMain.toString());//sMain=init
add(sMain);
System.out.println("sMain=" + sMain.toString());//sMain=init_add
changeRef(sMain);
System.out.println("sMain=" + sMain.toString());//sMain=init_add
}
}
以上程序的允许结果显示出,testBasicType方法的参数是基本类型,尽管参数m的值发生改变,但并不影响i。
add方法的参数是一个对象,当把sMain传给参数s时,s得到的是sMain的拷贝,所以s和sMain指向同一个对象,因此,使用s操作影响的其实就是sMain指向的对象,故调用add方法后,sMain指向的对象的内容发生了改变。
在changeRef方法中,参数也是对象,当把sMain传给参数s时,s得到的是sMain的拷贝,但与add方法不同的是,
在方法体内改变了
s
指向的对象(也就是
s
指向了别的对象
,
球的绳
),给
s
重新赋值后,
s
与
sMain
已经毫无关联
,它和sMain指向了不同的对象,所以不管对s做什么操作,都不会影响sMain指向的对象,故调用changeRef方法前后sMain指向的对象内容并未发生改变。
作者:
2528870651
时间:
2014-4-6 10:13
很好 啊 哈哈
建议你把testBasicType(int m)里面的 m换成i 更能说明问题,结果还是一样。
public static void testBasicType(int i) {
System.out.println("i=" + i);//i=50
i = 100;
System.out.println("i=" + i);//i=100
}
复制代码
欢迎光临 黑马程序员技术交流社区 (http://bbs.itheima.com/)
黑马程序员IT技术论坛 X3.2