Приведение объекта суперкласса в объект подкласса создает новый объект? - PullRequest
1 голос
/ 30 января 2012

Предположим, у меня есть Предмет суперкласса и Подкласс MovingItem.

Если я создаю массив элементов, а затем пытаюсь преобразовать один из уже созданных элементов в MovingItem и сохранить его в векторе, это означает, что я использую ссылку или создаю, например, новый объект.

Item[] itms = new Item[2];
itms[0] = new Item();
itms[1] = new Item();

Vector<MovingItem> movingItms = new Vector<MovingItem>();
movingItms.add((MovingItem) itms[0]);

Что произойдет, когда я приведу объект типа Itm, найденный в массиве itms с индексом 0, а затем сохраню его в векторе? Сохраняю ли я ссылку, или приведение создает новый объект типа MovingItem, а затем добавляет его в вектор.

Спасибо.

Ответы [ 5 ]

2 голосов
/ 30 января 2012

Ваш пример выбросит 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 голосов
/ 30 января 2012

Он всегда хранит ссылку - новый объект не создается.Значение приведения всегда фактически одно и то же - это ссылка на один и тот же объект, просто виртуальная машина проверит, что ссылка действительно является ссылкой на экземпляр подкласса.

Не забывайте, что Vector не содержит объектов - он только содержит ссылки.(Если у вас нет особой причины использовать Vector, вам настоятельно рекомендуется использовать вместо этого ArrayList<E>, кстати.)

1 голос
/ 30 января 2012

Хранит ссылку на itms[0] в векторе, но прежде чем он сможет это сделать, он должен проверить, что itms[0] на самом деле MovingItem.В этом случае, поскольку это не так, выдается ClassCastException, а Vector.add() никогда даже не вызывается.

1 голос
/ 30 января 2012

Кастинг никогда не создает новых объектов. Он просто говорит компилятору, что да, он может нам доверять, мы знаем, что делаем ... Забавно, что если мы ошибаемся, мы получаем ошибку времени выполнения во время присваивания ...

Примечание: не используйте Vector, используйте более быстрый и современный ArrayList.

1 голос
/ 30 января 2012

Будет выброшено ClassCastException с Item[] itms = new Item[2];.itms не имеет экземпляра MovingItem.

За пределами этого ссылка на объект сохраняется.Создание объекта не выполняется.

...