#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. Хотя оно тут не пригодится, но всё равно почитайте.
Комментариев нет:
Отправить комментарий