Подтвердить что ты не робот

Почему мы используем метод clone() в java?

Почему мы используем метод clone() в Java? (Пожалуйста, дайте ответ в отношении ограничения памяти.) Будет ли это уменьшать использование памяти? Если да, то как? Будет ли это уменьшать эффект утечки памяти?

4b9b3361

Ответ 1

Кроме того, не используйте клон, реализуйте конструктор копирования, вы задали вопрос о ограничениях памяти.

Идея клонирования заключается в создании точного дубликата клонированного объекта. Таким образом, в худшем случае вы используете в два раза больше объема памяти. Практически - немного меньше, потому что Строки часто интернированы и не будут клонироваться (обычно). Несмотря на то, что это до разработчика метода clone/copy constructor.

Вот краткий пример класса с конструктором копирования:

public class Sheep {
  private String name;
  private Fur fur;
  private Eye[2] eyes;
  //...

  // the copy constructor
  public Sheep(Sheep sheep) {
    // String already has a copy constructor ;)
    this.name = new String(sheep.name);

    // assuming Fur and Eye have copy constructors, necessary for proper cloning
    this.fur = new Fur(sheep.fur); 
    this.eyes = new Eye[2];
    for (int i = 0; i < 2; i++) 
       eyes[i] = new Eye(sheep.eyes[i]);
  }
}

Использование:

Sheep dolly = getDolly();  // some magic to get a sheep
Sheep dollyClone = new Sheep(dolly);

Ответ 2

Мы должны не использовать его. Это сломанная и устаревшая идиома, чего следует избегать в новом коде. Вместо этого лучше используйте конструктор копирования, если сможете.

Ответ 3

Клон() копирует значения объекта в другой. clone() сохраняет дополнительную задачу обработки для создания точной копии объекта.

Как вы можете видеть в приведенном ниже примере, обе ссылочные переменные имеют одинаковое значение.

class Student18 implements Cloneable{  
int rollno;  
String name;  

Student18(int rollno,String name){  
this.rollno=rollno;  
this.name=name;  
}  

public Object clone()throws CloneNotSupportedException{  
return super.clone();  
}  

public static void main(String args[]){  
try{  
Student18 s1=new Student18(101,"amit");  

Student18 s2=(Student18)s1.clone();  

System.out.println(s1.rollno+" "+s1.name);  
System.out.println(s2.rollno+" "+s2.name);  

}catch(CloneNotSupportedException c){}  

}  
}  

Выход:

101 amit
101 amit

Если мы создадим новый объект по новому ключевому слову и присвоим ему значение другого объекта, для этого потребуется много обработки. Поэтому для сохранения дополнительной задачи обработки мы используем метод clone().

Ответ 4

если нам нужно использовать много объектов с одинаковыми данными, тогда не создавайте объекты, используя новое ключевое слово. используйте метод clone для создания этого объекта, поскольку операция создания объекта с помощью метода clone выполняется быстрее, чем использование нового ключевого слова.

Ответ 5

Создание копии объекта сначала кажется прямой задачей:

Просто скопируйте значения всех свойств в другой экземпляр того же класса. Но как насчет переменных, которые ссылаются на другие объекты? Копии этих ссылочных значений означают, что они будут указывать на те же объекты, что и первый класс.

Но, возможно, это не то, что мы хотим. Возможно, мы хотим, чтобы все объекты, на которые ссылается копия, также были независимыми копиями.

Эти два типа копий объектов называются:

мелкая копия - точная битовая копия всех атрибутов исходного объекта глубокие копии - примитивы копируются точно, но объекты, на которые делается ссылка, копируются, а не сами ссылки. Класс Object, который наследуется всеми классами Java, включает метод clone(), который будет делать точные битовые копии всех свойств.

Однако clone() является защищенным методом. Таким образом, данный объект не может быть клонирован экземплярами любых классов вне пакета (если они не являются подклассами этого класса объектов). Это позволяет конструктору классов явно указывать, какие клоны (мелкие или глубокие) сделать.

Java требует классов, которые хотят переопределить метод clone(), чтобы реализовать клонируемый интерфейс. Метод clone() также должен быть общедоступным, чтобы переопределить ограничения доступа.

Например, класс HashTable реализует клонирование. Его метод clone() делает мелкую копию, поэтому ключи и значения скопированного HashTable будут ссылаться на те же объекты, что и оригинал.

Многие основные классы Java, однако, не реализуют клонируемые. Если для таких классов вызывается метод clone(), возникает результат CloneNotSupportedException.

Ответ 6

см. ограничения клонов

в нескольких словах он используется для копирования объектов вместо ссылок, это увеличивает использование памяти.