Клонирует ли метод клонирования переопределенные методы?
Главная
Вопросы
Клонирует ли метод клонирования переопределенные методы?
Если я клонирую экземпляр следующего класса и переопределяю метод при создании экземпляра, будет ли у клона переопределенный метод? Я не нашел ничего относительно такого поведения в https://docs.oracle.com/javase/7/docs/api/java/lang/Cloneable.html и https://docs.oracle.com/javase/7/docs/api/java/lang/Object.html#clone() .
public class ToBeCloned implements Cloneable{
public int returnInt() {
return 1;
}
public void printTest() {
System.out.println("returnInt():"+returnInt()+"\nToBeCloned Original");
}
@Override
public ToBeCloned clone() throws CloneNotSupportedException {
return (ToBeCloned) super.clone();
}
}
person
HopefullyHelpful
schedule
24.08.2020
source
источник
Ответы (2)
Если вы сделаете что-то вроде
new ToBeCloned() { @Override...}
это всего лишь краткий способ создания подкласса и его экземпляра. Если вы клонируете этот экземпляр, вы получите еще один экземпляр того же анонимного подкласса со всеми теми же методами.
person
khelwood
schedule
24.08.2020
Ответ - да, клон будет содержать переопределенные методы, по крайней мере, в javaSE-1.8.
Это иллюстрируется следующей программой и ее выводом:
public class OverridingMethods {
public static void main(final String[] args) {
final ToBeCloned toBeCloned1 = new ToBeCloned();
final ToBeCloned toBeCloned2 = new ToBeCloned() {
@Override
public int returnInt() {
return 2;
}
@Override
public void printTest() {
System.out.println("returnInt():"+returnInt()+"\nToBeCloned Overridden");
}
};
ToBeCloned toBeCloned3 = null;
ToBeCloned toBeCloned4 = null;
ToBeCloned toBeCloned5 = null;
try {
toBeCloned3 = toBeCloned1.clone();
toBeCloned4 = toBeCloned2.clone();
toBeCloned5 = toBeCloned4.clone();
} catch (final CloneNotSupportedException e) {
e.printStackTrace();
}
toBeCloned1.printTest();
toBeCloned2.printTest();
toBeCloned3.printTest();
toBeCloned4.printTest();
toBeCloned5.printTest();
}
}
Вывод программы следующий:
returnInt():1
ToBeCloned Original
returnInt():2
ToBeCloned Overridden
returnInt():1
ToBeCloned Original
returnInt():2
ToBeCloned Overridden
returnInt():2
ToBeCloned Overridden
Это доказывает, что переопределенный метод сохраняется, даже если клонируются уже клонированные экземпляры.
person
HopefullyHelpful
schedule
24.08.2020
new ToBeCloned() { @Override...}
- это лишь краткий способ создания подкласса. Если вы его клонируете, вы получите еще один экземпляр того же подкласса со всеми теми же методами. - person khelwood   schedule 24.08.2020