Почему можно вернуть закрытого члена?

Следующий пример кода взят с веб-сайта.

sInstance является частным членом, это означает, что он будет доступен только в классе LittleMonkProviderHolder.

Почему функция getInstance() может возвращать LittleMonkProviderHolder.sInstance? Спасибо!

Код

public class FloatActionController {

    private FloatActionController() {
    }

    public static FloatActionController getInstance() {
        return LittleMonkProviderHolder.sInstance;  //Return a private member!!!
    }


    private static class LittleMonkProviderHolder {
        private static final FloatActionController sInstance = new FloatActionController();
    }

}

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

Martin Zeitler 26.10.2018 05:23

@MartinZeitler Возможно, вы захотите прочитать вопрос еще раз. Это правильный вопрос, почему внешний класс может получить доступ к закрытому члену.

Kartik 26.10.2018 05:24

Ключевое слово @Kartik private имеет уровень доступа class: docs.oracle.com/javase/tutorial/java/javaOO/accesscontrol.ht‌ ml - это может быть как продвижением, так и опережением внутренних классов, в зависимости от того, что человек намеревается достичь.

Martin Zeitler 26.10.2018 05:27

Ах, я пропустил ключевой аспект этого вопроса при первом просмотре. Действительно, вопрос заключается в «почему (статический) частный экземпляр внутреннего класса виден внешнему классу».. Я ожидал ответа на основной вопрос «тип против экземпляра» и создал бесполезный пояснительный ответ, прежде чем читать более внимательно.

michael 26.10.2018 06:41

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

Vladyslav Matviienko 26.10.2018 06:52
0
5
75
1
Перейти к ответу Данный вопрос помечен как решенный

Ответы 1

Ответ принят как подходящий

Мне это кажется синглом Билла Пью. Нет ничего плохого в том, что возвращение является частным членом частного внутреннего класса в классе FloatActionController. Спецификатор private означает только попытку доступ поля напрямую через:

FloatActionController.LittleMonkProviderHolder.sInstance

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

Другие вопросы по теме