it-swarm.com.ru

Метод 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.
    }
}
43
sekhar

Эта ошибка возникает из-за того, что в классе объекта метод clone () защищен . Поэтому необходимо переопределить метод clone () в соответствующем классе . Например. Добавьте ниже код в MyClass 

@Override
protected Object clone() throws CloneNotSupportedException {

    return super.clone();
}

Также реализовать Cloneable интерфейс . Например. public class MyClass implements Cloneable

9
Prashant K

clone() имеет защищенный доступ. Добавьте это в MyClass

public Object clone(){  
    try{  
        return super.clone();  
    }catch(Exception e){ 
        return null; 
    }
}

Также измените на public class MyClass implements Cloneable

44
EsotericMe

Потому что clone () - это защищенный метод. Смотрите Object.clone () для подробностей.

Переопределите clone () в MyClass и заставьте класс реализовать Cloneable interface.

3
Suraj Chandran

Тонкость заключается в том, что метод clone()MyClass наследуется, а не определяется в MyClass. Таким образом, MyClass может вызывать clone() объекта, потому что он protected, но MyClass на самом деле не имеетclone() самого себя, поэтому TestSingleTon не может получить доступ к clone() из MyClass, потому что нет метода clone(). Хотя они оба находятся в одном пакете, вам нужно определить метод clone() в MyClass, чтобы убедиться, что он действительно «имеет» функцию clone(). Кстати, не забудьте реализовать интерфейс Cloneable для MyClass

1
spirit

Вам просто нужно заставить Class реализовать интерфейс Cloneable. Нет необходимости предоставлять реализацию для clone (). 

1
Swagatika

Метод Object.clone() имеет защищенный доступ, что означает it's visible to sub-classes and classes in the same package.

Хорошо иметь конструктор copy для ручного копирования объекта.

/**
    Deep copy all the information from other to this
*/
public MyClass (MyClass  other) {
     this.id = other.id;
}

ЧИТАТЬ Почему конструктор копирования от Джош Блох

0
prime

Я сделал тестовый код по этому вопросу, и вот мои выводы:

Когда защищенный член наследуется через пакет, он становится закрытым членом унаследованного класса

в то время как

когда защищенный член наследуется в том же пакете, он становится по умолчанию членом унаследованного класса.

В вашем примере clone () из класса Object наследуется в MyClass через пакет . Класс объекта находится в пакете Java.lang, а MyClass находится в пакете GoodQuestions . Таким образом, метод clone () становится закрытым членом класса MyClass ,.

Это объясняет, почему вы не можете получить доступ к методу clone () из класса TestSingleTon.

0
FocalPoint

Чтобы вы могли клонировать MyClass, он должен реализовать интерфейс Cloneable

0
Yanki Twizzy