2016-10-30 4 views
0

В java у нас есть и интерфейс cloneable Что я хочу понять, почему абстрактный класс реализует этот интерфейс, до сих пор не существует реализации метода clone() интерфейса в абстрактном классе?Шаблон создания прототипа

ответ

0

В Java мы имеем и интерфейс Cloneable То, что я хочу, чтобы понять почему абстрактный класс реализует этот интерфейс до сих пор нет реализации клона() метод интерфейса в абстрактный класс?

Класс объекта обеспечивает реализацию по умолчанию для методов Object, метод clone().

Если вы посмотрите Object класс, вы можете увидеть, что clone() указывает конкретное ключевое слово, указанное в его подписи: native.

protected native Object clone() throws CloneNotSupportedException; 

native ключевого слово применяется к методу, чтобы указать, что он реализован в JNI (Java Native Interface).
Итак, реализация существует где-то (возможно, в функции C, но не исключительно ...), но не непосредственно в исходном коде Java метода.

Наконец, вы должны рассмотреть Cloneable interface, что он означает: маркер interface. Если вы хотите, чтобы вы возражаете быть клонируемыми, осуществить это, и если вы не заботитесь, ничего не делать:

Класс реализует Cloneable интерфейс для указания метода Object.clone(), что является законным для этого метода сделать копию экземпляров этого класса для поля . Invoke Object метод clone для экземпляра, который не реализует интерфейс Cloneable , приводит к исключению исключения CloneNotSupportedException, которое выбрано .

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

0

Интерфейс Cloneable предназначен только для обозначения того, что класс поддерживает метод clone в Object.clone().

Класс реализует интерфейс Cloneable, чтобы указать методу Object.clone(), что для этого метода является законным копирование экземпляров этого класса в поле.

Вы не должны реализовать этот метод, Object.clone сделать это для Вас, в родной код:

protected native Object clone() throws CloneNotSupportedException; 

Взгляните на эти ссылки: Object class source code и Cloneable Interface docs

Несмотря на это, если у вас есть один абстрактный класс на уровне иерархии, вам не нужно реализовывать класс «Клонируемый» для детей:

abstract class Animal implements Cloneable { 

protected String name; 

public String getName() { 
    return name; 
} 

public void setName(String name) { 
    this.name = name; 
} 
} 

class Dog extends Animal { 

public int getAge() { 
    return age; 
} 

public void setAge(int age) { 
    this.age = age; 
} 
private int age; 

@Override 
public Dog clone() throws CloneNotSupportedException { 
    return (Dog)super.clone(); 
} 

Клон все еще поддерживается Java

Смежные вопросы