有人可以解释一下为什么我得到这个输出
package code;
import java.util.ArrayList;
class A {
}
class B extends A {
}
class C extends B {
}
public class ThreadDemo {
public static void main(String[] args) {
ArrayList<A> x = new ArrayList<A>();
ArrayList a = new ArrayList();
x.add(new A());
a = x;
a.add(new B());
ArrayList b = a;
ArrayList<C> c = (ArrayList<C>) b;
c.add(new C());
a.add(new A()); // I am not sure why object of A is also getting printed at the last
for (Object obj : c) {
System.out.println(obj + " class Name " + obj.getClass().getName());
}
}
}
输出:
----------
code.A@7852e922 class Name code.A
----------
code.B@4e25154f class Name code.B
----------
code.C@70dea4e class Name code.C
----------
code.A@5c647e05 class Name code.A
----------
答案 0 :(得分:2)
a
和c
是同一个对象。我们来看看代码的相关行:
ArrayList a = new ArrayList(); // a is created
ArrayList b = a; // b holds a reference to the same object
ArrayList<C> c = (ArrayList<C>) b; // and so does c
因此,无论何时向c
添加对象,它都会出现在a
中(因为,如上所述,它们是同一个对象!)。
答案 1 :(得分:1)
因为当你使用b=a
时,你只是保存对b中的a的引用。无论你对a表示什么改变都会影响b。既然你做了c=b
那么c也会受到影响。您没有保存列表的副本,然后更改其中一个的值,而是保存对b和c中的a的引用。
所以当你最后使用a.add()
时,它也被添加到b和c
答案 2 :(得分:1)
在您的代码中,您有4个ArrayList引用:x,a,b和c。
最初有两个ArrayList对象,其中a
是对一个的引用,x
是对另一个的引用。但是a = x
使得a
最初引用的ArrayList对象符合垃圾回收的条件。现在,a
和x
都引用了同一个ArrayList,并且您已经添加了A
的对象。因此ArrayList有[A]
接下来,向其添加B
对象,使arrayList的状态为[A,B]
。 a
和x
都指的是此列表。
接下来,您创建另一个引用b
,并使其也引用a
引用的对象,所以现在您有a
,b
,x
指的是同一个列表。
接下来,您创建另一个引用c
并使其引用b
所引用的同一对象,因此现在您有4个引用引用相同的列表。列表状态为[A,B]
。
现在,您使用引用C
在列表中添加c
对象,然后使用引用A
添加a
对象。由于所有4个引用都引用同一个ArrayList,因此A
和B
的对象都会添加到list的列表和状态中:[A,B,C,A]
。
现在当您迭代列表并在System.out.println()
中使用引用打印时,toString()
方法被调用,因为您没有覆盖它,因此从Object.java
得到的方法得到了调用。
你的问题的答案,为什么A
的对象在最后被打印? :因为列表在最后包含它,如上所述。希望它有所帮助。
答案 3 :(得分:1)
您要将第一个from gi.repository import Gtk
import win32ui
class Window(Gtk.Window):
def __init__(self):
Gtk.Window.__init__(self)
self.connect("destroy", Gtk.main_quit)
self.show_all()
Window()
Gtk.main()
对象分配给所有ArrayList
引用。
ArrayList
因此,您在整个代码中将元素分配给相同的ArrayList<A> x = new ArrayList<A>();
ArrayList a = new ArrayList();
//x.add(new A());
a = x; //now a & x refer to same object.
//a.add(new B());
ArrayList b = a; //b refer to the same object.
ArrayList<C> c = (ArrayList<C>) b; //now a,b,x & c every reference refer the same object.
。
希望这会有所帮助......