Модификатор частного доступа для методов во вложенных классах - PullRequest
1 голос
/ 08 мая 2020

Обратите внимание на следующий фрагмент кода.

public class HelloWorld{

    private static class InnerA{
        private int _a;

        private InnerA( int a ){
            _a = a;
        }

        private int getA(){
            return _a;
        }

    }

    private static class InnerB{
        private InnerB(){
            InnerA inner_a = new InnerA( 1 ); //isn't the constructor of InnerA private??
            System.out.println( inner_a.getA() ); //isn't getA() a private function of InnerA??
        }

    }
    public static void main(String []args){
       InnerB b = new InnerB();
    }
}

Мои вопросы:

  1. InnerA конструктор отмечен как закрытый, но почему он успешно вызывается из конструктора InnerB ?

  2. Почему getA(), который является частным методом InnerA, может быть вызван изнутри InnerB? Я думал, что отметка метода как закрытого предотвратит его использование за пределами InnerA?

Ответы [ 3 ]

2 голосов
/ 08 мая 2020

Из языка spe c:

В противном случае член или конструктор объявляется закрытым, и доступ разрешается тогда и только тогда, когда он встречается в теле тип верхнего уровня (§7.6), который включает объявление члена или конструктора.

Вещи внутри одного и того же класса верхнего уровня всегда доступны.

0 голосов
/ 08 мая 2020

В документации говорится:

Вложенный класс является членом своего включающего класса. Нестатические c вложенные классы (внутренние классы) имеют доступ к другим членам включающего класса, даже если они объявлены частными.

0 голосов
/ 08 мая 2020

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

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

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