Метод clone () из объекта не виден? - PullRequest
45 голосов
/ 25 февраля 2011

Вопрос:

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.
    }
}

Ответы [ 8 ]

45 голосов
/ 25 февраля 2011

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

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

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

10 голосов
/ 28 июля 2016

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

@Override
protected Object clone() throws CloneNotSupportedException {

    return super.clone();
}

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

3 голосов
/ 25 февраля 2011

Поскольку clone () является защищенным методом.Подробнее см. Object.clone () .

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

1 голос
/ 25 июня 2016

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

1 голос
/ 14 мая 2011

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

0 голосов
/ 11 июня 2018

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

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

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

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

0 голосов
/ 23 февраля 2013

Я сделал некоторый тестовый код для этого и вот мои выводы:

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

, тогда как

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

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

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

0 голосов
/ 25 февраля 2011

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

...