将超类的对象转换为子类的对象会创建一个新对象吗?

时间:2012-01-30 15:23:42

标签: java casting reference subclass superclass

假设我有一个超类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的新对象,然后将其添加到向量中。

感谢。

5 个答案:

答案 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()