Подтвердить что ты не робот

Метод 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.
    }
}
4b9b3361

Ответ 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.