Как стать автором
Обновить

Комментарии 13

Интересно а почему нельзя создавать экземпляр статического вложенного класса? Не спец в java, но такие классы по идее должны быть подобны вложенным классам в с++ т.е. они используют объемлющий класс просто как пространство имен.

Вы это все прочитали? Поздравляю :-)


Разумеется, создать экземпляр вложенного класса — можно. Кстати, из такого класса видны любые члены внешнего класса, а не только статические: https://ideone.com/U3c9Qb, так что тут у автора полная ерунда написана...

Чутка не успел. Аналогичный случай. ideone.com/N1Czmt
Уже исправил, Спасибо
А видимость нестатических членов внешнего класса почему не исправили?
Только что проверил
public class OuterClass {
    public String outerStr = "outerStr";
    public static class StaticInner{
        public static void staticInnerMethod(){
            System.out.println(outerStr);
        }
        public void innerMethod(){
            System.out.println(outerStr);
        }
    }
}

Обе строки «System.out.println(outerStr);» выдают ошибку.
Если сделать outerStr статическим — всё работает нормально

Дык это не видимость, а вы не указали объект. Должно быть что-то вроде
OuterClass oc;

System.out.println(oc.outerStr);


(я, если что, Java по сути не знаю, но ошибка не привязана к языку; простой способ понять — написать обращения к полям через this и подумать, что должно быть вместо него в данном случае)

Хорошее резюме!!! Было бы супер, внизу сделать таблицу сравнения, чтобы разница в правилах(или ее отсутствие) была видна невооруженным глазом!

Согласен, таблица будет вполне уместной. И примеры кода — как в комментариях

Ещё не написали, что в одном файле исходного кода можно разместить множество не вложенных классов, не являющихся public, с уровнем доступа package-private (без модификатора доступа). В одном файле может содержаться только один public класс.
После компиляции количество файлов будет равно количеству не вложенных классов.
public class A {
}
class B {
}
class C {
}
Я, например, стараюсь так не делать. Приходится сопровождать код с таким подходом, по 5-7 тысяч строк файлы, с множеством не вложенных классов. Это кошмар.
Стоит упомянуть, что если Inner класс обращается к приватным полям или методам внешнего класса, компилятор генерирует synthetic accessor метод с package модификатором видимости, чтобы тот в свою очередь мог достучаться до приватного метода.

Таким образом, если вы вызывате приватный метод внешнего класса, вы на самом деле вызываете 2 метода, accessor и тот, к которому требуется доступ.

Сделано это потому, что в Java после компиляции нет понятия Inner класса. Inner класс всего лишь станет package классом в том же пакете, рядом с внешним классом.
Ещё у локальных классов есть доступ к локальным effectively final переменным метода, в котором он определён.
Зарегистрируйтесь на Хабре, чтобы оставить комментарий

Публикации

Истории