Почему я не могу вызвать защищенный метод из наследующего класса в другом пакете в Java? - PullRequest
8 голосов
/ 03 марта 2012

Скажем, есть следующий базовый класс:

package bg.svetlin.ui.controls;

public abstract class Control {
    protected int getHeight() {
        //..
    }
    //...
}

Кроме того, в том же пакете есть класс, который наследует:

package bg.svetlin.ui.controls;

public abstract class LayoutControl extends Control {
    public abstract void addControl(Control control);
    //...
}

Затем есть третий класс в другом пакете:

package bg.svetlin.ui.controls.screen;

public abstract class Screen extends LayoutControl {
    //...
}

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

package bg.svetlin.ui.controls.screen.list;    

public class List extends Screen {

    private final Vector controls = new Vector();

    public void addControl(Control control) {
        height += control.getHeight();
        controls.addElement(control);
    }
}

Даже если List наследуется от Control, а getHeight()protected, есть следующая ошибка:

getHeight () имеет защищенный доступ в bg.svetlin.ui.controls.Control

Я проверил, что мойимпорт прав.Я использую NetBeans.

Есть идеи, что случилось?Я думал, что protected поля и методы видны детям, даже если последние находятся в другом пакете.

Спасибо!

Ответы [ 2 ]

18 голосов
/ 03 марта 2012

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

Это правильно.Сам класс имеет доступ к унаследованным защищенным членам.Но то, что вы пытаетесь сделать, это вызвать метод getHeight для некоторого контрольного задания.Вы можете вызывать его только на этом экземпляре!

Для лучшего понимания позвольте мне процитировать Руководство по подготовке SCJP Кэти Сьерры *1013*:

Но что это значит для подкласса вне пакетаиметь доступ к суперклассу (родительскому) члену?Это означает, что подкласс наследует член.Это, однако, не означает, что подкласс вне пакета может получить доступ к члену, используя ссылку на экземпляр суперкласса.Другими словами, защищено = наследование. Подкласс может видеть защищенный член только через наследование .

2 голосов
/ 03 марта 2012

Ты прав.Любой член protected или method доступен из дочернего класса, но вы хотите получить доступ к защищенному методу экземпляра параметра в методе addControl.Вы можете получить доступ только к protected методу List класса (this.getHeight())

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...