Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате
Форум программистов > Java: Общие вопросы > clone()


Автор: Granje 28.7.2012, 23:02
Здравствуйте. Я новичок в Java. Подскажите почему в этом коде возникает ошибка "clone() has protected access in Object"

Код

public class EqualsTest implements Cloneable {
    
    public static void main(String[] args) {
        
        Object test = "Hey!";
        
        System.out.println(test.clone().equals(test));
    }
    
}


Как я понимаю EqualsTest наследник Object, значит он наследует метод clone(). Ведь даже в описании clone() в API есть такой пример "x.clone().equals(x)
 will be true". В теории должно работать, но не работает.

Автор: Stolzen 28.7.2012, 23:51
Должно быть
Код

EqualsTest test = new EqualsTest("Hey!");


И, плюс к этому, нужен правильно переопределенный метод equals

Автор: Granje 29.7.2012, 09:17
На самом деле я немного затупил. Класс должен называться CloneTest. То есть интересует почему возникает ошибка доступа к методу clone(). Ведь, как я понял, доступ protected это видимость или в том же пакете, или в подклассах. Допуститим полное имя моего класса com.my.test.CloneTest и он же является подклассом Object. И должно работать...

Цитата

Должно быть
Код

EqualsTest test = "Hey!";



Это констуктор писать... Я что не могу клонировать обьект типа Object? И вообще это писалось чтобы руками попробовать метод clone(), и не должно было быть никаких сложностей. 

Автор: dorogoyIV 29.7.2012, 10:30
в исходник загляни...
метод clone() пустой и к тому же protected
он зарезервирован, и ты должен его сам переопределить...
для некоторых объектов он определен - например календарь...

Автор: Granje 29.7.2012, 10:46
ага, всему виной "ця бусурманська мова", вернее ее не знание). в доках выражение  "x.clone().equals(x) will be true" это рекомендация к реализации. Я подумал что он уже реализован и в нем оно уже определено). 

Всем спасибо! Пойду дальше грызть гранит Java smile 

Автор: priam220 30.7.2012, 15:13
Цитата(dorogoyIV @  29.7.2012,  10:30 Найти цитируемый пост)
метод clone() пустой и к тому же protected

он не пустой, он native. Его можно не переопределять, если устраивает зона видимости и поверхностное клонирование объекта.

Автор: dorogoyIV 30.7.2012, 16:03
priam220, не у всех.
для некоторых нужно вызывать тяжелое клонирование (или как там это называется - я уже не помню...).
и как я уже говорил, для некоторых объектов этот метод уже определен - java.util.Calendar;

Powered by Invision Power Board (http://www.invisionboard.com)
© Invision Power Services (http://www.invisionpower.com)