доступ к переменной внутреннего класса члена

Не могли бы вы помочь мне понять ошибку компилятора java8 в строке k3.

    public class Color {
        private int hue = 10;
        public class Shade {
                public int hue = 20;
        }
        public static void main(String[] args) {
                System.out.println(new Color().hue); // k1
                System.out.println(new Color().new Shade().hue); //k2 
                System.out.println(new Shade().hue); //k3
        }
}

Приведенный выше код компилируется, если я закомментирую k3. k1 выводит 10, k2 выводит 20.

С k3 компиляция не сообщает:

Color.java:11: error: non-static variable this cannot be referenced from a static context
                System.out.println(new Shade().hue);

Основной метод находится в статическом контексте, понятен. Где на этой картинке нестатическая переменная this. Спасибо.


person Ram    schedule 28.01.2019    source источник
comment
проблема в том, что new Shade() нужна Color-ссылка. Это не имеет ничего общего с доступом к переменной - удалите .hue, он все равно не скомпилируется   -  person Hulk    schedule 28.01.2019
comment
Если вы измените класс на static class Shade, он будет компилироваться.   -  person Hulk    schedule 28.01.2019
comment
Спасибо @Hulk. Но почему компилятор не может сказать это простым языком?   -  person Ram    schedule 28.01.2019
comment
@ Ram ну, вам придется задать этот вопрос разработчику, написавшему компилятор;) На более серьезном замечании: на самом деле это просто частный случай попытки доступа к переменной экземпляра из статического контекста.   -  person Hulk    schedule 28.01.2019
comment
Некоторые IDE фактически предоставляют более четкие сообщения - eclipse показывает, что закрывающий экземпляр типа Color недоступен. Должен квалифицировать выделение с помощью включающего экземпляра типа Color (например, x.new A (), где x - это экземпляр Color).   -  person Hulk    schedule 28.01.2019