看了http://www.cndw.com/tech/program/2006042962403.asp上的这篇文章,有点小体会,不知道对不对,先记下来。
我们知道,java中的实例变量中存储的是一种特殊的数据结构(对象的引用,通过它能访问它所指向的对象,但它不是那个对象,而仅相当于那个对象的别名),看下面的两个例子:
/* 例 2 */
/**
* @(#) Test.java
* @author fancy
*/
public class Test {
public static void main(String[] args) {
StringBuffer a = new StringBuffer("Hello");
StringBuffer b = a;
b.append(", World");
System.out.println("a is " + a);
}
}
===============================================================
/* 例 3 */
/**
* @(#) Test.java
* @author fancy
*/
public class Test {
public static void test(StringBuffer str) {
str.append(", World!");
}
public static void main(String[] args) {
StringBuffer string = new StringBuffer("Hello");
test(string);
System.out.println(string);
}
}
它们的结果是一样的,main中的对象改变了。而下面的例子
/* 例 4 */
/**
* @(#) Test.java
* @author fancy
*/
public class Test {
public static void test(String str) {
str = "World";
}
public static void main(String[] args) {
String string = "Hello";
test(string);
System.out.println(string);
}
}
结果显然,main中的对象并没有改变,这是因为在传参的过程中,相当于执行了
“形参”=“实参”;
这样一个表达式,即例3、例4中调用test方法时,相当于执行了一次str=string,也就是test方法中的str成了main中的对象的一个别名,但是在例4中,这个别名又指向了另外一个对象,所以没有对main中的对象造成影响,
我们知道,java中的实例变量中存储的是一种特殊的数据结构(对象的引用,通过它能访问它所指向的对象,但它不是那个对象,而仅相当于那个对象的别名),看下面的两个例子:
/* 例 2 */
/**
* @(#) Test.java
* @author fancy
*/
public class Test {
public static void main(String[] args) {
StringBuffer a = new StringBuffer("Hello");
StringBuffer b = a;
b.append(", World");
System.out.println("a is " + a);
}
}
===============================================================
/* 例 3 */
/**
* @(#) Test.java
* @author fancy
*/
public class Test {
public static void test(StringBuffer str) {
str.append(", World!");
}
public static void main(String[] args) {
StringBuffer string = new StringBuffer("Hello");
test(string);
System.out.println(string);
}
}
它们的结果是一样的,main中的对象改变了。而下面的例子
/* 例 4 */
/**
* @(#) Test.java
* @author fancy
*/
public class Test {
public static void test(String str) {
str = "World";
}
public static void main(String[] args) {
String string = "Hello";
test(string);
System.out.println(string);
}
}
结果显然,main中的对象并没有改变,这是因为在传参的过程中,相当于执行了
“形参”=“实参”;
这样一个表达式,即例3、例4中调用test方法时,相当于执行了一次str=string,也就是test方法中的str成了main中的对象的一个别名,但是在例4中,这个别名又指向了另外一个对象,所以没有对main中的对象造成影响,