现在有这样一段代码:
[code="java"]import java.util.ArrayList;
import java.util.List;
public class RefTest {
public String testString(String str){
str = "1111";
return str;
}
public void testList1(List<String> strs){
List<String> newStrs = new ArrayList<String>();
newStrs.add("11");
newStrs.add("22");
strs = newStrs;
}
public void testList2(List<String> strs){
strs.clear();
strs.add("11");
strs.add("22");
}
}[/code]
接下来,有一段代码会调用其中的方法。
[code="java"]import java.util.ArrayList;
import java.util.List;
public class Client {
/**
* @param args
*/
public static void main(String[] args) {
String string = "Hello";
RefTest ref = new RefTest();
String string1 = ref.testString(string);
System.out.println("String :"+string);
System.out.println("String1 :"+string1);
List<String> list = new ArrayList<String>();
list.add("a");
list.add("b");
ref.testList1(list);
System.out.println("list1 result:");
for (String str : list) {
System.out.println(str);
}
ref.testList2(list);
for (String str : list) {
System.out.println(str);
}
}
}[/code]
而这短代码的运行结果是:
Hello
1111
a
b
11
22
对于第一个方法调用来说,我们可以认为Hello是一个全局变量,把它传到一个局部的方法里时,是不会改变它的值,那么后面两段代码的结果就让人费解了。这个据说个JVM里perm引用有关,可是,我是个java初学者,实在是搞不懂。希望大家不吝赐教!
呃,形参吧。
你肯定搞错了。
难道你上手就是学的java?
c 语言没有学过?
形参,java也不是直接传引用的,而是传值的。
另外java中没有指针概念,只有引用概念。
对于
String string = "Hello";
RefTest ref = new RefTest();
String string1 = ref.testString(string);
string作为一个引用,值并未变过。
对于,
List list = new ArrayList();
list.add("a");
list.add("b"); // list 对象是一个引用
ref.testList1(list); // 传入的是list 对象的一个copy,所以list对象没有变化
System.out.println("list1 result:");
for (String str : list) {
System.out.println(str);
}