Исключение в потоке "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());
}
}
Поскольку вы не реализовали 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;
}
}
Другие ответы правильны, указывая, что ваш класс должен реализовать 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
Ваш класс не реализует интерфейс Cloneable, поэтому это исключение было выбрано. Это можно найти прямо в Java API.
Ваш класс должен реализовать java.lang.Cloneable интерфейс.
public class Color implements Cloneable
{
public String ColorName()
{
return "Red";
}
@Override
public Color clone() {
//return your cloned Color instance
}
}
clone()
и почему?