public abstract class Class1 {
protected static Object object1 = null;
protected static Object object2 = null;
public static Object[] objects = { object1, object2 };
public static void main(String[] args) {
new Class2();
for (Object o : objects) {
System.out.println(o);
}
}
}
public class Class2 extends Class1 {
public Class2() {
Class1.object1 = new String("String 1");
Class1.object2 = new String("String 2");
}
}
输出:
null
null
为什么?
当我创建Class2
的新实例时,该类的构造函数会初始化object1
和object2
。
objects
包含对这些对象的引用。因此,在他们初始化之后,我期待任何东西,但是无效。
有人可以解释一下吗?感谢。
答案 0 :(得分:5)
object
不包含对这些object1
和object2
的引用,但包含复制的引用到这些对象。
如果你这样做:
public static Object[] objects;
public static void main(String[] args) {
new Class2();
objects = { object1, object2 };
for (Object o : objects) {
System.out.println(o);
}
}
即。在初始化object
和object1
之后初始化object2
,您将在数组中拥有非空的副本。
答案 1 :(得分:3)
首先实现对象的实现
protected static Object object1 = null;
protected static Object object2 = null;
将object1
和object2
设为null
- 参考。
然后这个
objects = { object1, object2 };
将object1
和object2
包含的引用复制到objects[0]
和objects[1]
。
然后在这里
Class1.object1 = new String("String 1");
Class1.object2 = new String("String 2");
您创建了新的String
- 存储在object1
和object2
中的引用 - 但objects[0]
和objects[1]
中的副本不受影响。