#java #clone
#java #клонировать
Вопрос:
почему я получаю метод клонирования, не видимый для класса object
class a7 implements Cloneable
{
int id;
float f;
}
class test
{
public static void main(String[] args) throws CloneNotSupportedException {
a7 x=new a7();
// x.clone(); //here i am getting the error
}
}
хотя метод clone защищен и к нему доступны подклассы и и один в том же пакете, и мы знаем, что каждый класс по умолчанию является подклассами класса object
Комментарии:
1. Находятся ли
a7
иtest
классы в одном пакете?2.
clone()
естьprotected
. Стандартная практика — переопределить его, создатьpublic
и заставить возвращать ваш тип, а неObject
. Не забудьте вызватьsuper.clone()
.3. @BoristheSpider какая-либо причина или что?
4. Пожалуйста, придерживайтесь соглашений об именовании Java. Классы должны быть в
PascalCase
.camelCase
зарезервирован для переменных.5. howtodoinjava.com/2012/11/08/a-guide-to-object-cloning-in-java/… эта ссылка
Ответ №1:
Из документов:
По соглашению, классы, которые реализуют этот интерфейс, должны переопределять Object.clone (который защищен) с помощью общедоступного метода. Смотрите Object.clone() для получения подробной информации о переопределении этого метода.
Я бы также ознакомился с советом Джошуа Блоха по поводу Cloneable
Если вы читали статью о клонировании в моей книге, особенно если вы читаете между строк, вы будете знать, что я думаю, что clone сильно поврежден. Есть несколько недостатков дизайна, самым большим из которых является то, что в клонируемом интерфейсе нет метода clone. И это означает, что он просто не работает: создание чего-либо клонируемого ничего не говорит о том, что вы можете с этим сделать. Вместо этого в нем говорится кое-что о том, что он может делать внутри. В нем говорится, что если при повторном вызове super.clone в конечном итоге вызывается метод clone объекта, этот метод вернет копию поля оригинала
.