Вызовите защищенный метод из подкласса другого экземпляра других пакетов

Я хочу вызвать защищенный метод другого экземпляра из подкласса класса, обеспечивающего этот защищенный метод. Смотрите следующий пример:

public class Nano {

    protected void computeSize() {
    }

}

public class NanoContainer extends Nano {

    protected ArrayList children;

}

public class SomeOtherNode extends NanoContainer {

    // {Nano} Overrides

    protected void computeSize() {
        for (Nano child: children) {
            child.computeSize();            // < computeSize() has protected access in nanolay.Nano
        }
    }

}
 Niklas R18 янв. 2013 г., 19:18
@MiserableVariable: Это хорошо? Я также заменилinstance-methods сpackages тег.
 Miserable Variable18 янв. 2013 г., 19:13
Не могли бы вы добавить квалификацию пакета в заголовок вопроса, так как это представляется уместным?
 Niklas R18 янв. 2013 г., 18:30
Ааа, пакеты .. не сделалне думать об этом. Я хотел предоставить урезанную версию кода. Я'отредактировал вопрос.
 Miserable Variable18 янв. 2013 г., 19:46
Да, это хорошо Кстати, принятый ответ нуждается в некоторых исправлениях.
 Scorpion18 янв. 2013 г., 18:30
Вы также можете показать пакеты, в которых находятся классы?

Ответы на вопрос(2)

Дон»Не знаю обоснования, но JLS подтверждает это в6.6.2. Подробности о защищенном доступе (выделение мое):

Защищенный член или конструктор объекта может быть доступен изза пределами пакета, в котором он объявлен только кодом, который отвечает за реализацию этого объекта.

Так:

package P2;
public class P2 {
    protected void foo() {}
}

.........

package P2A;    
class P2A extends P2.P2 {
    void bar(P2.P2 other) {
        this.foo(); // OK
        other.foo();  // ERROR
    }

    void bar2(P2A other) { 
        other.foo(); //OK
    }
}   

ВP2A.bar вызовthis.foo() доступно потому чтоthis несет ответственность за реализациюP2 other.foo() недоступен, потому чтоother не может бытьP2Abar2 с другой стороны, имеетP2A так что все хорошо.

Теперь, почему все в порядке, если они все в одном пакете, но не в том случае, если они разные? Каково обоснование? Я нене знаю и хотел бы знать.

Мета-комментарий Я откатил недавнее обновление от другого пользователя, так как оно существенно меняет ответ и, вероятно, больше подходит как ответ самого верхнего уровня.

 Niklas R18 янв. 2013 г., 19:17
Спасибо за это резюме, я определенно согласен с вами. Такое поведение не кажется мне законным.
 user609173509 июн. 2018 г., 07:48
для доступа к защищенным членам или защищенным методам извне того же пакета, который вы не можете использовать родительский объект класса, только реализующий объект класса может быть использован для доступа к защищенным членам родительского класса вне того же пакета "
 amarnath harish08 июн. 2018 г., 12:02
почему другие должны бытьP2A  разве этого недостаточно для того, чтобыP2.P2 чтобы получить доступfoo(); так как foo объявлен вP2.P2, просьба уточнить"
 Miserable Variable18 янв. 2013 г., 19:50
Возможно, вы можете задать еще один вопрос об обосновании> Может не подходить для этого форума, нопрограммисты любит эти типы вопросов
Решение Вопроса

Вы можете получить доступ к защищенным методам либо путем подкласса и переопределения; также когда они доступны в той же упаковке. Я добавлю некоторые детали. Ты можешь читатьподробности Вот.

Пример, который у вас есть, находится на линииprotected clone() метод, доступный в классе Object в Java; Вы не можете напрямую вызвать его для любого объекта (хотя все объекты неявно выходят из класса Object).

 Miserable Variable18 янв. 2013 г., 19:45
clone нельзя назвать, потому что этоprotected вObject, который находится в упаковкеjava.lang и этот класс не в этом пакете.
 Scorpion18 янв. 2013 г., 18:44
Экземпляр объекта someothernode имеет доступ к защищенному методу computeSize, но не к какому-либо другому экземпляру someothernode - поэтому он не находится в цикле for.
 Miserable Variable18 янв. 2013 г., 19:44
@ Скорпион, который кажется неправильным. Компилируется без ошибок, если все они находятся в одном пакете.
 Scorpion18 янв. 2013 г., 19:51
Да, он будет правильно скомпилирован, если все классы находятся в одном пакете. Пример клона показывает, что - защищенный метод в другом пакете не может быть вызван; поэтому вы создаете класс сотрудника вне java.lang, поэтому метод clone для этого объекта класса сотрудника не может быть вызван, если он не предоставляет его через открытый модификатор
 Niklas R18 янв. 2013 г., 18:41
Но я не могу создать подкласс и вызвать метод для другого экземпляра суперкласса, так какя делаю выше? (Предполагая, что они находятся в разных пакетах, потому что это работает, когда они находятся в одном пакете)

Ваш ответ на вопрос