Доступ к закрытым статическим членам вложенных статических классов

Рассмотрим следующий фрагмент кода:

Файл: ListPool.java

package smc;

import smc.ListPool.MyLinkedList;

public class ListPool {                          // (1) Top-level class

    public static class MyLinkedList {             // (2) Static member class

        private static String str = "test";     // (2')

        private interface ILink { }                  // (3) Static member interface

        public static class BiNode                   // (4) Static member class
        implements IBiLink {

            public static void printSimpleName() {     // (5) Static method
                System.out.println(BiNode.class.getSimpleName());
            }

            public void printName() {                  // (6) Instance method
                System.out.println(this.getClass().getName());
            }
        } // end BiNode
    } // end MyLinkedList

    interface IBiLink
    extends MyLinkedList.ILink {         // (7) Static member interface
        //  private static class Traversal { }           // (8) Compile-time error!
        //     Can only be public.
        class BiTraversal { }                        // (9) Class is public and static
    } // end IBiLink

    public class SortedList {                      // (10) Non-static member class
        private static class SortCriteria {}         // (11) Static member class
    }

    public static void main(String[] args) {
        String test = MyLinkedList.str;             // (12)
    }
}

Я удивлен, что (7) и (12) скомпилированы без ошибок, поскольку они обращаются к частному полю класса. Это что-то особенное, что статические вложенные классы привносят в Java?

Все, что я вижу здесь, находится в контексте окружающего класса. Все они имеют доступ к private полям и методам друг друга, вот как это работает. Нет никакой разницы между доступом к приватному полю из ListPool или из MyLinkedList. Это все «один класс», поэтому у вас есть доступ ко всем закрытым членам.

markspace 22.05.2023 18:23

Спецификация языка Java 6.6.1. Определение доступности: «Член (...) класса,... доступен, только если (i) класс,... доступен и (ii) член или конструктор объявлен для разрешения доступа: ..., член или конструктор объявляется закрытым. Доступ разрешен только в том случае, если выполняется одно из следующих условий: Доступ происходит из тела класса или интерфейса верхнего уровня, который заключает в себе объявление члена или конструктора. ... " (одно преимущество/причина для вложенных классов)

user16320675 22.05.2023 18:30
Пользовательский скаляр GraphQL
Пользовательский скаляр GraphQL
Листовые узлы системы типов GraphQL называются скалярами. Достигнув скалярного типа, невозможно спуститься дальше по иерархии типов. Скалярный тип...
Как вычислять биты и понимать побитовые операторы в Java - объяснение с примерами
Как вычислять биты и понимать побитовые операторы в Java - объяснение с примерами
В компьютерном программировании биты играют важнейшую роль в представлении и манипулировании данными на двоичном уровне. Побитовые операции...
Поднятие тревоги для долго выполняющихся методов в Spring Boot
Поднятие тревоги для долго выполняющихся методов в Spring Boot
Приходилось ли вам сталкиваться с требованиями, в которых вас могли попросить поднять тревогу или выдать ошибку, когда метод Java занимает больше...
Полный курс Java для разработчиков веб-сайтов и приложений
Полный курс Java для разработчиков веб-сайтов и приложений
Получите сертификат Java Web и Application Developer, используя наш курс.
0
2
54
1
Перейти к ответу Данный вопрос помечен как решенный

Ответы 1

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

Если это внутренний или вложенный класс, даже члены private доступны для окружающего класса.

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