class Untitled {
public static void main(String[] args) {
StringBuffer s;
s = new StringBuffer("Java");
StringBuffer s1 = s;
s1.append(" World");
System.out.println("s1=" + s1.toString());//打印结果为:s1=Java World
System.out.println("s= " + s.toString());//打印结果为:s=Java World
}
}
(1)上面程序说明这里的s1和s均是引用类型,和int类型的基本类型不同
(2)s1和s指向的是同一的内存地址
StringBuffer s1 = s; 这里的=不是赋值的意思 而是s1指向s的内存地址,两个的内存地址是一样的,apppend后两个都要变化
package test;
public class Test {
//基本类型的参数传递
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
}
}
(1)
问:当一个对象被当作参数传递到一个方法后,此方法可改变这个对象的属性,并可返回变化后的结果,那么这里到底是值传递还是引用传递? 答:是值传递。 Java 编程语言只有值传递参数。当一个对象实例作为一个参数被传递到方法中时,参数的值就是该对象的引用一个副本。指向同一个对象,对象的内容可以在被调用的方法中改变,但对象的引用(不是引用的副本)是永远不会改变的。
(2) A a1 = new A(); 它代表A是类,a1是引用,a1不是对象,new A()才是对象,a1引用指向new A()这个对象。
(3)sMain 在add之后 相当于 指向new StringBuffer("init_add");
public static void changeRef(StringBuffer s) { //这是 s与sMain 指向的是同一对象new StringBuffer("init_add")
s = new StringBuffer("Java"); //s指向了另外一个对象,sMain未改变
}
更详细的可以参考http://zwmf.iteye.com/blog/1738574