2013-04-06 5 views
0

Допустим, у меня есть суперкласс A с интерфейсом clone и глубоким переопределенным методом клонирования.Общий метод клонирования java override

У меня также есть подкласс Б.

B Temp = new B(); 
B Temp_Clone = (B) Temp.clone(); 

Метод Temp.clone() возвращает ссылку на клонирован супер класса А, верно?

С моей точки зрения, я не могу поставить ссылку на суперкласс в объекте подкласса, правильно?

Так как же возможен код, который я здесь написал? из-за литья?

Спасибо.

+0

Почему вы не удаляете кастинг, чтобы увидеть, возвращает ли компилятор ошибку или не узнает о вашем последнем вопросе? в любом случае, я полагаю, что если вы это сделаете, вы получите ошибку компиляции; кастинг необходим при ссылке на суперобъект с помощью ссылочной переменной под-объекта. и посмотрите на @EJP ответ ниже, который я считаю лучшим ответом на ваши вопросы. –

ответ

0

метод Класс объекта Клон() создает и возвращает копию объекта, с тем же классом и со всеми полями, имеющими одинаковые значения. Однако Object.clone() выдает исключение CloneNotSupportedException , если только объект не является экземпляром класса, который реализует интерфейс маркера Cloneable.

0

Метод Temp.clone() возвращает ссылку на клонированный супер класса А, верно?

Право.

Из моего понимания, я не могу поместить ссылку на суперкласс в объект подкласса, правильно?

Неправильно.

Так как же возможен код, который я здесь написал? из-за литья?

Я не знаю, что вы думаете об этом невозможно, но, безусловно, требуется кастинг.

+0

Ну, потому что B Temp_Clone является подклассом, с другой стороны, Temp.clone() является суперклассом, как вы можете ссылаться на суперкласс на объект подкласса? – user2102697

+0

@ user2102697 'A.clone()' возвращает клон текущего объекта, независимо от его типа, который должен быть или расширять A по определению, но он * набирается * как объект класса Object, опять по определению, поэтому typecast необходимо. Все это непосредственно вытекает из подписи метода и его спецификации в Javadoc. – EJP

+0

@onepotato OP заявила, что A является суперклассом B. – EJP

-1

Ну, если код в A называется super.clone, поэтому объект, созданный при вызове Temp.clone, является объектом из типа B., поскольку клоун не вызывает конструктор! clone, реализованный в классе объектов как родной класс и элемент предварительной формы, и создать тот же объект, что и этот объект. поэтому ClonedTemp имеет тип B.

Смежные вопросы