Можно ли использовать метод clon () без переопределения - PullRequest
0 голосов
/ 26 октября 2019

У меня возникли некоторые проблемы с моим учителем, мы должны освоить концепции Java примерно за один месяц, он говорит, что возможно следующее:

, поэтому в Java каждый класс наследуется от класса Object,этот класс предоставляет нам методы, такие как protected Object clone(), например: Теперь давайте скажем, что у нас есть class Car

// позже в основном:

Car mycar=new Car();
//he is saying now that  following is possible:
Car yourCar=(Car) mycar.clone();

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

есть что-то, чего мне не хватает?

Ответы [ 2 ]

1 голос
/ 26 октября 2019

Да, вы можете использовать .clone() без переопределения, если класс реализует Cloneable.

Вот пример:

class Car implements Cloneable {
  String name;
  public Car(String n) {
    name = n;
  }

  public static void main(String[] args) throws Exception {
    Car c1 = new Car("Lightning McQueen");
    Car c2 = (Car) c1.clone();
    System.out.println(c2.name);
  }
}

Вот описание по умолчаниюповедение clone () , когда класс реализует Cloneable, но не переопределяет clone():

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

1 голос
/ 26 октября 2019

Ваш учитель прав, если Car выставляет переопределенную реализацию public Object clone. Подклассы могут расширять доступ к переопределенным методам , поэтому clone может иметь доступ public. Вы также можете вызвать метод внутри самого класса, даже если вы не расширили доступ.

И clone сгенерирует CloneNotSupportedException , если вызывается для объекта, который не переопределенit :

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

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

...