Доступ к частным методам в подклассе с использованием ссылки на суперкласс - PullRequest
0 голосов
/ 02 августа 2020
package privatePkg;
class privateImp {
    private void print() {
        System.out.println("Inside the PrivateImp class method "+this);
    }

    public void access() {
        print();
    }
}

class SubClass extends privateImp {
    public static void main(String ... args) {
        System.out.println("In the subclass");
        SubClass sb = new SubClass();
        sb.access();
    }
}

Здесь, поскольку метод print() объявлен частным в суперклассе privateImp, мы расширяем этот класс. Когда я создаю объект подкласса и пытаюсь получить доступ к унаследованному методу access(), он также вызывает закрытый метод суперкласса. Поскольку это частный метод, к нему нельзя обращаться в других классах, но только члены этого класса могут получить к нему доступ. Тогда как частный метод был вызван access() в объекте подкласса?

Скажите, пожалуйста, так как я не переопределил метод access(), унаследованный от суперкласса, компилятор заменит строку внутри accesss() в подклассе следующим образом:

class SubClass extends privateImp() {
    public void access() {
        super.access();
    }
}

Ответы [ 5 ]

0 голосов
/ 02 августа 2020

Основной метод подкласса вызывает access () в классе privateImp и оттуда вызывается print (). Вы можете увидеть это, если откроете иерархию вызовов print (). Всякий раз, когда вы переопределяете access () и снова открываете иерархию вызовов, вы можете видеть разницу. Это поведение по умолчанию, если вы расширяете класс и не переопределяете видимые методы.

Кстати, имена классов не должны начинаться с малого регистра.

0 голосов
/ 02 августа 2020

Контроль доступа в Java не зависит от того, какой класс вызывает метод во время выполнения. Он основан на том, где находится вызывающий код в исходном коде.

Здесь вызов частного метода находится в классе privateImp, поэтому он разрешен. Не имеет значения, что вы создали подкласс и вызвали access в экземпляре подкласса.

0 голосов
/ 02 августа 2020

В Java вы не можете напрямую получить доступ к частному методу извне класса, то есть вы не можете вызвать частный метод по его имени.

Итак, чтобы получить доступ к частному методу извне class, вам нужно вызвать один из его прокси publi c, то есть один из методов publi c класса, который имеет доступ к частному методу и действует как интерфейс для него, что вы и делаете.

Это фундаментальный принцип абстракции / сокрытия данных в действии.

0 голосов
/ 02 августа 2020

Если вы не хотите переопределять функцию access() и не хотите, чтобы к функции print() обращались другие классы, но только члены этого класса могут получить доступ к ней.

вы можете просто измените модификатор функции print() с private на protected. Также вы можете удалить функцию access(), так как она вам больше не нужна.

0 голосов
/ 02 августа 2020

Подкласс не наследует закрытые члены своего родительского класса. Однако, если у суперкласса есть publi c или защищенные методы для доступа к его закрытым полям, они также могут использоваться подклассом.

Вложенный класс имеет доступ ко всем закрытым членам своего включающего класса - обоим поля и методы. Следовательно, publi c или защищенный вложенный класс, унаследованный подклассом, имеет косвенный доступ ко всем закрытым членам суперкласса.

Подробнее см. Официальную документацию здесь .

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