在这里.假设我有这门课
public class EpicClass{ public static ArrayListarylst = new ArrayList<>(); public String field1; public String field2: }
现在,如果我执行此代码:
/* ... Code which adds stuff to arylst ... */ EpicClass foo = new EpicClass(); EpicClass bar = new EpicClass();
ArrayList中的东西是否会重复foo
并且bar
?
在初始化类时,静态变量被分配一次.从Java语言规范,§8.3.1.1 static
字段:
如果一个字段被声明为static,那么无论该类最终可以创建多少个实例(可能为零),都只存在该字段的一个化身.初始化类时,静态字段(有时称为类变量)会显示(第12.4节).
请注意,这指的是字段本身,而不是字段可能包含的任何值.除非声明了字段final
,否则可以一个接一个地为其赋值.特别是,每次创建实例时,您都可以[误]使用构造函数为字段赋值.通常,应避免在构造函数中指定静态字段.(有一些例外,例如使用静态字段来计算实例对象创建.)
您可以使用类名或使用对实例的引用来访问静态字段.1因此,以下都是等效的(提供的foo
和bar
类型EpicClass
):
EpicClass.arylst foo.arylst bar.arylst
(通过实例引用访问静态字段被认为是错误的并且通常会生成编译器警告,但它完全正常 - 即使引用是null
,因为编译器将其转换为第一种形式.)仅在这个意义上," "ArrayList中的内容"似乎在类的每个实例中都是重复的.但是,只有一个实例,ArrayList
您只是通过(看似)不同的机制访问它.
当然,1 提供了可访问的字段.