доступ к защищенному методу в другом пакете? - PullRequest
1 голос
/ 02 июля 2010

Если я скажу

class A{
}

, тогда он неявно наследует класс Object. Итак, у меня есть класс, как показано ниже:

class A{

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

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

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

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

Ответы [ 3 ]

3 голосов
/ 02 июля 2010

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

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

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

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

1 голос
/ 02 июля 2010

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

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 голосов
/ 02 июля 2010

Если вы не переопределите метод клонирования для A, то не удивляйтесь, если вы действительно вызываете метод Object clone (), а не A.

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

class A {}

class B {
  A a = new A();

  public B() {
    A x = (A) ((Object) a).clone();
  }
}
...