Наследование классов Java, частные поля, доступные в подклассе, почему? - PullRequest
2 голосов
/ 21 февраля 2011

У меня есть код, очень похожий на следующий.

package my.pkg;

public abstract class X {
    private CapableField field;

    public abstract void doSomething();

    public X(CapableField fieldValue) {
        this.field = fieldValue;
    }
}

И

package my.pkg.sub;

public class Y extends my.pkg.X {
    public void doSomething() {
        this.field.doSomething();
    }
}

Почему это даже допустимый код на Java? Я думал, что «private» означает, что поле не будет напрямую доступно в подклассах, и что это был довольно простой принцип наследования классов. Создание X бетона вместо абстрактного ничего не меняет.

Что мне делать, если я специально хочу, чтобы поле или функция-член были доступны только внутри класса, в котором оно определено, а не в каком-то случайном подклассе определяющего класса?

Ответы [ 5 ]

3 голосов
/ 21 февраля 2011

Это не правда. Скорее всего, вы на самом деле определили Y как внутренний класс . Таким образом, частные поля внешнего класса действительно видны вот так.

2 голосов
/ 21 февраля 2011

Не компилируется и для меня!Я подозреваю, что ваша реализация Java.

1 голос
/ 21 февраля 2011

Это невозможно. Может быть, вы что-то упустили, когда объясняете свой вопрос.

0 голосов
/ 21 февраля 2011

Убедитесь, что ваши занятия в двух разных файлах. например X.java и Y.java, а у не внутренний класс

0 голосов
/ 21 февраля 2011

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

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

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