Может ли подкласс получить доступ к полю, объявленному как private в суперклассе?

Добрый день! <br/> В документации указано: <br/> <blockquote>A private field of a superclass might be accessible to a subclass - for example, if both classes are members of the same class. Nevertheless, a private field is never inherited by a subclass.</blockquote> <br/> На русском: <br/> <blockquote>Поле private суперкласса может быть доступно подклассу, например, если оба класса являются членами одного и того же класса. Тем не менее, private поле никогда не наследуется подклассом.</blockquote> <br/> <br/> Могли бы вы, пожалуйста, привести пример, иллюстрирующий это положение?
  • 16 апреля 2025 г. 14:55
Ответы на вопрос 2
Добрый день!

Да, вы правы, что поле, объявленное как `private` в суперклассе, не может быть непосредственно доступно из подкласса. Однако если оба класса (суперкласс и подкласс) являются вложенными классами одного и того же внешнего класса, то подкласс может получить доступ к `private` полям суперкласса.

Вот пример, который иллюстрирует это:

```java
public class OuterClass {
    
    private class SuperClass {
        private int privateField = 42;

        private int getPrivateField() {
            return privateField;
        }
    }
    
    private class SubClass extends SuperClass {
        public void printPrivateField() {
            // Подкласс может получить доступ к private полю суперкласса,
            // поскольку оба класса вложены в один и тот же внешний класс
            System.out.println("Private field value: " + getPrivateField());
        }
    }

    public void createSubClass() {
        SubClass subClass = new SubClass();
        subClass.printPrivateField();  // Вызов метода подкласса, который выводит значение private поля
    }

    public static void main(String[] args) {
        OuterClass outer = new OuterClass();
        outer.createSubClass(); // Создаем экземпляр внешнего класса и вызываем метод
    }
}
```

В этом примере:

1. У нас есть внешний класс `OuterClass`.
2. Внутренний класс `SuperClass` объявлен как `private` и имеет `private` поле `privateField`.
3. Внутренний класс `SubClass` наследует `SuperClass`, и поскольку оба класса являются членами одного и того же класса `OuterClass`, `SubClass` может получить доступ к полю `privateField` через метод `getPrivateField()` суперкласса.
4. Метод `printPrivateField()` в `SubClass` выводит значение `privateField`.

Так что, если оба класса являются внутренними членами одного и того же внешнего класса, то к `private` полям суперкласса можно получить доступ через методы суперкласса.
class C {
  public static class Inner1 {
    private static int x = 0;
  }  
  public static class Inner2 {
    static void foo() {
      ++Inner1.x;
    }
  }
}

class D extends C.Inner1 {
   static void bar() {
     //++x;  не работает
   }
}
Похожие вопросы