Доброго времени суток.
В доп. материалах к 21 уровню прочитал, что, если хочешь пользоваться реализацией клонирования по умолчанию (той, что есть у класса Object), то нужно реализовать интерфейс Cloneable и переопределить метод clone(), вызвав в нём метод clone() класса предка. Это я понял, усвоил, запомнил: вобщем или реализовывай clone() с нуля, не обращаясь к методу clone() суперкласса (тогда и маркернрый интерфейс Cloneable по сути не нужно реализовывать в своём классе) или делай то, о чем я написал ранее. Усвоено.
У меня нет понимания почему нельзя просто реализовать интерфейс Cloneble без переопределения метода clone(), если я хочу реализацией по умолчанию воспользоваться. Лезу к класс Object, вижу у метода clone() модификатор protected, понимаю, что этот метод должен быть доступен всем наследникам, коими являются все классы. Но компилятор ругается на попытку вызвать метод clone() без его переопределения в моём классе. Думаю, ну наверное нужно явное наследование может быть, добавляю к своему классу extands Object (оставив разумеется implements Cloneable), но компилятор все равно ругается на попутку вызвать clone() без его переопределения в моём классе. Ну, то есть я понял как надо клонировать правильно, но я хочу докопаться и понять, как компилятор понимает, что нельзя воспользовать реализацией по умолчанию, не переопределив её в своём классе.
Ну вот на такой простой пример компилятор ругается в месте вызова метода clone()
public class CloneTesting {
public static class Cat extends Object implements Cloneable {
String name;
public Cat(String name) {
this.name = name;
}
//@Override
//public Cat clone() throws CloneNotSupportedException {
// return (Cat) super.clone();
//}
}
public static void main(String[] args) throws CloneNotSupportedException {
Cat cat1 = new Cat("Пуля");
//вариант клонирования по умолчанию.
Object cat2 = cat1.clone();
System.out.println(cat1);
System.out.println(cat2);
}
}