Не удается получить доступ к полю из статического расширяющего класса, содержащегося в том же файле .java - PullRequest
0 голосов
/ 19 декабря 2018

Я не могу понять, является ли это скрытой функцией, которую я никогда не обнаруживал, или ошибкой от IntelliJ Idea.

Имея этот класс,

public class StackOverflow {
    private String abc;

    public static class StackOverflowExtended extends StackOverflow {
        public StackOverflowExtended() {
            abc = "";
        }
    }
}

IntelliJ сообщает мне, что я не могу получить доступabc потому что он либо имеет частный доступ, либо потому, что я нахожусь в статическом контексте.

Как только я получаю доступ к abc по super, он начинает работать.

public class StackOverflow {
    private String abc;

    public static class StackOverflowExtended extends StackOverflow {
        public StackOverflowExtended() {
            super.abc = "";
        }
    }
}

Ответы [ 2 ]

0 голосов
/ 19 декабря 2018

Там нет ошибок или скрытых функций не происходит.Вы, вероятно, смешиваете наследование и внутренние классы.

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

public class StackOverflow {
    private String abc;
    public class StackOverflowExtended extends StackOverflow {
        public StackOverflowExtended() {
            abc = "";
        }
    }
}

Статический внутренний класс не может получить доступ к полям своего внешнего класса, потому что он статический.Он может существовать, не имея экземпляра своего внешнего класса.

Причина, по которой super.abc работает со статическим внутренним классом, заключается в том, что он является его подклассом.Доступность, не зависящая от области его действия, опять же обусловлена ​​тем, что он является внутренним классом.

0 голосов
/ 19 декабря 2018

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

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

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

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