Метод clone() из объекта не отображается?
Вопрос:
package GoodQuestions;
public class MyClass {
MyClass() throws CloneNotSupportedException {
try {
throw new CloneNotSupportedException();
} catch(Exception e) {
e.printStackTrace();
}
}
public static void main(String[] args) {
try {
MyClass obj = new MyClass();
MyClass obj3 = (MyClass)obj.clone();
} catch (CloneNotSupportedException e) {
e.printStackTrace();
}
}
}
Здесь класс MyClass может клонировать свой собственный объект, вызывая метод clone в классе Object.
Когда я пытаюсь клонировать этот класс ( "MyClass" ) в другом классе ( "TestSingleTon" ) в том же пакете "GoodQuestions", он бросает следующую ошибку времени компиляции.
'Метод clone() из типа Object не отображается'
Итак, вот код, который он выбрасывает вышеприведенную ошибку?
package GoodQuestions;
public class TestSingleTon {
public static void main(String[] args) {
MyClass obj = new MyClass();
MyClass obj3 = obj.clone(); ---> here is the compile error.
}
}
Ответы
Ответ 1
Эта ошибка возникает, потому что в методе Object class clone() защищен.
Поэтому вам необходимо переопределить метод clone() в соответствующем классе.
Например. Добавьте ниже код в MyClass
@Override
protected Object clone() throws CloneNotSupportedException {
return super.clone();
}
Также реализуем интерфейс Cloneable.
Например. public class MyClass implements Cloneable
Ответ 2
clone()
имеет защищенный доступ. Добавьте это в MyClass
public Object clone(){
try{
return super.clone();
}catch(Exception e){
return null;
}
}
Также измените на public class MyClass implements Cloneable
Ответ 3
Потому что clone() - защищенный метод. Подробнее см. Object.clone().
Переопределить clone() в MyClass и сделать реализацию класса Cloneable.
Ответ 4
Вам просто нужно сделать MyClass реализовывать Cloneable-интерфейс. Нет необходимости выполнять прогон для clone().
Ответ 5
Чтобы вы могли клонировать MyClass, он должен реализовать интерфейс Cloneable
Ответ 6
Я сделал несколько тестовых кодов, и вот мои выводы:
Когда защищенный член наследуется через пакет, он становится частным членом унаследованного класса
тогда
когда защищенный элемент наследуется в одном пакете, он становится членом по умолчанию для унаследованного класса.
В вашем примере clone() из класса Object наследуется в MyClass через пакет.
Класс объекта находится в пакете java.lang, а MyClass - в пакете GoodQuestions.
Таким образом, метод clone() становится частным членом класса MyClass.
Это объясняет, почему вы не можете получить доступ к методу clone() из класса TestSingleTon.
Ответ 7
Тонкость заключается в том, что метод clone()
MyClass
наследуется, а не определяется в MyClass
. Поэтому MyClass
может вызывать clone()
объекта, потому что он защищен, но MyClass
сам по себе не имеет clone()
, поэтому TestSingleTon
не может получить доступ к clone()
из MyClass
, потому что там не является методом clone()
. Хотя они оба находятся в одном пакете, вам нужно определить метод clone()
в MyClass
, чтобы убедиться, что он действительно "имеет" clone()
. Кстати, не забудьте реализовать интерфейс Cloneable
для MyClass
.