#java #объекты #клонирование
Код, написанный мной для тренировки: class Korobka { public double width, depth, height; //Объявление переменных public static int id = 4; Korobka(double w, double d, double h) { width = w; depth = d; height = h; } double volume() { return width * depth * height; } void measurement() { System.out.println("Длина коробки " + width); System.out.println("Ширина коробки " + depth); System.out.println("Высота коробки " + height); System.out.println("Объем коробки " + volume()); } public static void main(String[] args) { Korobka k1 = new Korobka(4.5, 3.6, 3.7); Korobka k2 = new Korobka(4, 5, 6); k1.measurement(); k2.measurement(); int ID = Korobka.id; System.out.println(ID); } } Вздумалось мне метод clone() из класса Object применить. Вопросы: Могу ли я применить этот метод, к примеру, к коробке k1 (для клонирования)? Если да, то как это сделать?
Ответы
Ответ 1
В дополнение к предыдущим ответам хочу отметить, что лучше реализовать clone() вот так: class Korobka implements Cloneable { @Override public Korobka clone() { try { return (Korobka)super.clone(); } catch( CloneNotSupportedException ex ) { throw new InternalError(); } } //всё остальное } Так как вы интерфейс Cloneable указали, CloneNotSupportedException никогда случиться не должен, и пользователи вашего класса не должны мучаться с ним, оборачивая вызовы в try-catch. Кроме того вы можете быть уверены, что возвращаемый объект имеет тип Korobka и привести тип сами. Тогда пользователи смогут просто писать: Korobka copy = k1.clone(); Вообще у клонирования много проблем и оно не всегда хорошо (хотя бывают случаи, когда очень удобно). Альтернативой клонированию служит конструктор копирования: class Korobka { Korobka(double w, double d, double h) { width = w; depth = d; height = h; } Korobka(Korobka other) { this(other.width, other.depth, other.height); } } Пользоваться тогда немного по-другому: Korobka copy = new Korobka(k1);Ответ 2
Да сможете. В java объекты передаются по ссылкам. Т.е. следующий код Object o1 = new Object(); Object o2 = o1; создаёт один объект, на который указывают две ссылки. Очень часто это бывает не удобно - изменяем объект о1 изменяется объект о2. А, к примеру, нужно было в объект о2 просто скопировать значения из о1, но никак не связывать их. Для этих целей был введён интерфейс Cloneable. В своём клаccе вам нужно реализовать его: class Korobka implements Cloneable { @Override protected Object clone() throws CloneNotSupportedException { return super.clone(); } //всё остальное }Ответ 3
Для начала нужно, чтобы ваш класс Korobka имплементил маркерный интерфейс Cloneable. Далее, вам надо переопределить метод clone() и сделать его публичным. Тогда вы сможете где угодно в своем коде клонировать коробки. P.S. Прежде чем переопределять метод, почитайте про глубокое копирование объектов в Java. Хотя оно тут не пригодится, но всё равно почитайте.
Комментариев нет:
Отправить комментарий