3

假设我有一堂课

    public class c1 {
        public static ArrayList<String> list = new ArrayList<String>();

        public c1() {
            for (int i = 0; i < 5; i++) {   //The size of the ArrayList is now 5
                list.add("a");
            }
        }
    }

但是如果我在另一个类中访问相同的 ArrayList,我将得到一个 SIZE = 0 的列表。

     public class c2 {
         public c2() {
             System.out.println("c1.list.size() = " + c1.list.size()); //Prints 0
         }
     }

为什么会这样。如果变量是静态的,那么为什么要为类 c2 生成一个新列表?如果我在不同的类中访问它,如何确保获得相同的 ArrayList?

/ * ** *修改后的代码* ** * **** /

     public class c1 {
        public static ArrayList<String> list = new ArrayList<String>();

        public static void AddToList(String str) {       //This method is called to populate the list 
           list.add(str);
        }
    }

但是如果我在另一个类中访问同一个 ArrayList,我将得到一个 SIZE = 0 的列表,无论我调用了多少次 AddToList 方法。

     public class c2 {
         public c2() {
             System.out.println("c1.list.size() = " + c1.list.size()); //Prints 0
         }
     }

当我在另一个类中使用 ArrayList 时,如何确保出现相同的更改?

4

1 回答 1

7

在您的代码中,您应该调用c1构造函数以填充ArrayList. 所以你需要:

public c2() {
    new c1();
    System.out.println("c1.list.size() = " + c1.list.size()); //Prints 0
}

但这并不好。最好的方法是在类中使用static块代码进行静态初始化:c1

public class c1 {
    public static ArrayList<String> list = new ArrayList<String>();

    static {
        for (int i = 0; i < 5; i++) {   //The size of the ArrayList is now 5
            list.add("a");
        }
    }

    public c1() {

    }
}

作为“编程到接口”意味着什么的建议?,最好将变量声明为List<String>并将实例创建为ArrayList

public static List<String> list = new ArrayList<String>();

另一个建议,使用一种static方法来访问这个变量而不是公开它:

private static List<String> list = new ArrayList<String>();

public static List<String> getList() {
    return list;
}
于 2013-03-31T13:59:54.913 回答