我不确定为什么A的对象也会在最后打印出来

时间:2017-06-17 11:52:07

标签: java collections

有人可以解释一下为什么我得到这个输出

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
----------

4 个答案:

答案 0 :(得分:2)

ac是同一个对象。我们来看看代码的相关行:

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对象符合垃圾回收的条件。现在,ax都引用了同一个ArrayList,并且您已经添加了A的对象。因此ArrayList有[A]

接下来,向其添加B对象,使arrayList的状态为[A,B]ax都指的是此列表。 接下来,您创建另一个引用b,并使其也引用a引用的对象,所以现在您有abx指的是同一个列表。

接下来,您创建另一个引用c并使其引用b所引用的同一对象,因此现在您有4个引用引用相同的列表。列表状态为[A,B]

现在,您使用引用C在列表中添加c对象,然后使用引用A添加a对象。由于所有4个引用都引用同一个ArrayList,因此AB的对象都会添加到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.

希望这会有所帮助......