2010-07-02 2 views
1

Если я говорюДоступ к защищенному методу в другом пакете?

class A{ 
} 

то неявно наследует Object class.So Я имею класс, как показано ниже:

class A{ 

     protected Object clone(){ 
     } /// Here i am not overridning 
     //All the other methods (toString/wait/notify/notifyAll/getClass) 
} 

Теперь Почему я не могу получить доступ к методу в классе B клон(), который является в той же упаковке класса А.

Class B{ 
     A a = new A(); 
     a.clone(); 
     ** 
} 

// ** Говорит, что клон защищен в классе объектов. Но я не обращаюсь к методу клонирования объекта. Поэтому я вызываю метод клонирования класса А, который я еще не перегрузил.

+2

Ваши фрагменты вводят в заблуждение. класса А {} и класса А { защищала клон() {}} не эквивалентны вообще. В первом случае вы не реализуете метод clone во время выполнения фрагмента 2. Ошибка, которую вы вызываете, не отображается со сниппетом 2. – dodecaplex

+0

Это не ответит на ваш вопрос, но в новом API предпочитают статические фабричные методы или конструкторы копирования для клон(). – helpermethod

+0

Что вы подразумеваете под своим комментарием '/// Здесь я не переопределяю? Как вы не переопределяете это? В Object метод 'clone' имеет точно такую ​​же подпись, что и' A.clone', поэтому он переопределяет его. –

ответ

3

Метод protected определен в java.lang.Object, поэтому вы не можете вызывать его из другого пакета - только из подклассов.

Вы вызываете его по ссылке A, но это метод java.lang.Object, пока вы его не отмените.

При переопределении clone(), вы должны изменить модификатор на public и осуществить Cloneable. Однако использование метода clone() не является хорошей идеей, потому что его очень сложно реализовать правильно. Используйте commons-beanutils, чтобы сделать мелкие клоны.

Убедитесь, что вы выполняете различие между «переопределением» и «перегрузкой».

+0

@Bozho: Как я уже говорил, я не переопределяю метод clone. Но почему я не могу получить доступ к этому методу из класса B? – JavaUser

+0

@JavaUser - вы определенно переопределяете его в 'A'! – Bozho

+0

@Bozho: Нет. Я не переопределяю. Я сказал неявное значение наследования от Object. – JavaUser

1

это прекрасно работает

class A{ 

     protected Object clone(){ 
      return this; 
     } 
} 

public class B{ 
     public B() { 
      A a = new A(); 
      a.clone(); 
      System.out.println("success"); 
     } 
     public static void main(String[] args) { 
     new B(); 
    } 

} 
+0

Как я прокомментировал, я не переопределяю метод clone. Пожалуйста, удалите метод clone из приведенного выше фрагмента и скомпилируйте код. – JavaUser

+1

@JavaUser: это неясно в вашем вопросе, поэтому у вас нет защищенного клона() в объекте A, он остается в качестве объекта защищенного метода и, как таковой, не может вызываться за пределами пакета java.lang –

-1

Если вы не переопределить метод клонирования для А, то, что не удивительно, если вы на самом деле, вызывая метод Объекта клон(), а не в.

Вы получаете ту же самую ошибку с

class A {} 

class B { 
    A a = new A(); 

    public B() { 
    A x = (A) ((Object) a).clone(); 
    } 
} 
Смежные вопросы