请教一下,这个变量到底是怎么控制的

现在有这样一段代码:
[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);  
    }