假设我有一个超类Item和一个子类MovingItem。
如果我创建了一个项目数组,然后尝试将一个已经创建的项目转换为一个MovingItem并将其存储到一个向量中,这是否意味着我使用了一个引用,或者我创建了一个新对象,例如。 / p>
Item[] itms = new Item[2];
itms[0] = new Item();
itms[1] = new Item();
Vector<MovingItem> movingItms = new Vector<MovingItem>();
movingItms.add((MovingItem) itms[0]);
当我在索引0处的数组itms中发现类型为Itm的对象然后将其存储到向量中时会发生什么?我是否存储引用或者转换会创建一个类型为MovingItem的新对象,然后将其添加到向量中。
感谢。
答案 0 :(得分:2)
它始终存储引用 - 不创建新对象。转换的值实际上总是相同的值 - 它是对同一对象的引用,只是VM将验证引用确实是对子类实例的引用。 / p>
不要忘记Vector
不包含对象 - 仅包含引用。 (除非您有特殊原因要使用Vector
,否则您应该强烈考虑使用ArrayList<E>
,而不是btw。)
答案 1 :(得分:2)
您的示例将抛出ClassCastException
。您可以仅将对象转换或分配给其实际类型或其任何超类型,但不能转换为其子类型。
Item i = new MovingItem(); // ok, because a MovingItem is an Item
// a cast is possible, but redundant in this place
MovingItem mi = new Item(); // won't compile, an Item isn't a MovingItem
MovingItem mi = (MovingItem) new Item(); // throws ClassCastException
// an Item isn't a MovingItem
当然,转换对象不会创建新对象,它只会创建一个新引用(如果转换不会失败并带有ClassCastException
,如上所述)。
Object o = new Integer(5); // assign an Integer instance to an Object variable
Integer i = (Integer) o; // cast and assign to a new Integer variable
// still points the the same actual instance
assert i == o; // true, these two variables point to the same Integer instance
答案 2 :(得分:1)
这将从ClassCastException
开始Item[] itms = new Item[2];
。 itms
没有MovingItem
的实例。
除此之外,存储对象的引用。没有完成对象创建。
答案 3 :(得分:1)
Casting永远不会创建新对象。它只是告诉编译器,是的,它可以信任我们,我们知道我们在做什么......有趣的是,如果我们错了,我们会在分配时遇到运行时错误......
旁注:不要使用Vector,使用更快更现代的ArrayList。
答案 4 :(得分:1)
它会在向量中存储itms[0]
的引用,但在它可以执行此操作之前,必须检查itms[0]
实际上是MovingItem
。在这种情况下,由于它不是,抛出ClassCastException
,甚至从不调用Vector.add()
。