有关Java static的疑问(凑字数的...)

public class StaticTest {

private static List<String> listA;
private static List<String> listB;

static {
    listA = new ArrayList<String>();
    listA.add("aaa");

    setB(listB);
}

public static void main(String[] args) {
    System.out.println(listA == null);
    System.out.println(listB == null);
}

private static void setB(List<String> listB) {
    if (listB == null) {
        listB= new ArrayList<String>();
        listB.add("bbb");
    }
}

}

我不知道为什么listB是空的,谁能详细解释下?

setB方法里面的listB被你重新new了,就和private那个不是同一个对象了,所以listB是空的

因为你方法里面初始化的是方法的参数listB,而不是类的属性listB。图片说明

 public class test_1 {
private static ArrayList<String> listA;
private static ArrayList<String> listB;

static {
    listA = new ArrayList<String>();
    listA.add("aaa");

    listB = setB(listB);
}

public static void main(String[] args) {
    System.out.println(listA == null);
    System.out.println(listB == null);
}

private static ArrayList<String> setB(ArrayList<String> listB) {
    if (listB == null) {
        listB = new ArrayList<String>();
        listB.add("bbb");
        System.out.println("asdasd");
    }
    return listB;
}
}

你是在子函数里new的,改变的是子函数里的listB,要把引用传回来再赋值给listB。

setb中new的对象,只是局部变量,不会影响到外面的listB,所以你要想有数据,不要new ,直接用外面的就行

因为被局部变量覆盖了

 private static void setB(List<String> listB) {//这里定义的listB覆盖了外部定义的static,把这改成private static void setB(List<String> listB1)
    if (listB == null) {
        listB= new ArrayList<String>();
        listB.add("bbb");
    }
}

局部的变量使用完 就回收了