почему клон не работает?

1

Исключение в потоке "main" java.lang.RuntimeException: Некомпилируемый исходный код незарегистрированного исключения java.lang.CloneNotSupportedException; должен быть пойман или объявлен брошенным на Test.main(Test.java:13) Java Результат: 1

 public class  Color
 {
     public String ColorName()
     {
         return "Red";
     }
 }
 public class Test extends Color
 {
    public static void main(String args[])
    {
       Color MyShirt = new Color();
       Color MyBag = (Color) MyShirt.clone();

       System.out.println(MyShirt.ColorName());
       System.out.println(MyBag.ColorName());
    }
 }
  • 3
    Как вы думаете, как работает clone() и почему?
  • 0
    я ожидаю выход Red Red
Показать ещё 1 комментарий
Теги:
oop

4 ответа

2
Лучший ответ

Поскольку вы не реализовали Cloneable, а Object имеет реализацию clone() по умолчанию, которая CloneNotSupportedException только CloneNotSupportedException; Я думаю, вы хотели чего-то подобного

public class Color implements Cloneable {
  protected String name = "Red";

  public String ColorName() {
    return name;
  }

  @Override
  public Object clone() {
    Color c = new Color();
    c.name = this.name;
    return c;
  }
}
1

Другие ответы правильны, указывая, что ваш класс должен реализовать Clonable и переопределить метод clone(), чтобы работать как ожидалось:

class Color implements Clonable{
    @Override 
    public Color clone(){
        Color c = new Color();
        c.name = this.name;
        return c;
    }
    // other methods
}

Однако самое главное в clone() заключается в том, что вы всегда должны избегать его использования.

Джошуа Блох объясняет в своей книге "Эффективная Java", что clone() глубоко нарушен и по праву рекомендует использовать вместо этого конструктор копирования. Вы можете прочитать об этом здесь.

Вместо использования clone() вы должны объявить конструктор копирования следующим образом:

class Color{
    public Color(){ /* ... */ } // default constructor
    public Color(Color c){
        this.name = c.name; // copy all attributes
    }
    // other methods
}

а затем использовать его для копирования объекта:

Color c = new Color();
Color other = new Color(c); // returns a copy of c
1

Ваш класс не реализует интерфейс Cloneable, поэтому это исключение было выбрано. Это можно найти прямо в Java API.

1

Ваш класс должен реализовать java.lang.Cloneable интерфейс.

public class  Color implements Cloneable
{
    public String ColorName()
    {
        return "Red";
    }

    @Override
    public Color clone() {
        //return your cloned Color instance
    }
}

Ещё вопросы

Сообщество Overcoder
Наверх
Меню