вложенный класс имеет переменную stati c? - PullRequest
0 голосов
/ 10 апреля 2020

Я знаю, что во вложенном классе не было элемента stati c,

class OuterClass {
     class InnerClass {
      private static int x = 0; // this is error
     }

}

Но когда мы объявили его с final

 class OuterClass {
     class InnerClass {
      private static final int x = 0; // ok
     }
}

, связано ли оно с последним ключевым словом, потому что переменная не может быть изменена больше? Или есть другая причина для этого?

Ответы [ 2 ]

1 голос
/ 10 апреля 2020

Такое поведение предписано Java Спецификацией языка :

8.1.3. Внутренние классы и вложенные экземпляры

Внутренний класс - это вложенный класс, который не объявлен явно или неявно. Stati c.

Внутренний класс может быть классом, не являющимся членом c ( §8.5 ), локальный класс ( §14.3 ) или анонимный класс ( §15.9.5 ). Класс-член интерфейса неявно является stati c ( §9.5 ), поэтому никогда не считается внутренним классом.

Это ошибка времени компиляции, если внутренний класс объявляет инициализатор stati c ( §8.7 ).

Ошибка времени компиляции, если внутренний класс объявляет член, который явно или неявно stati c, если член не является константной переменной ( §4.12.4 ).

Внутренний класс может наследовать элементы stati c, которые не являются постоянными переменными даже если он не может их объявить.

Вложенный класс, который не является внутренним классом, может свободно объявлять члены stati c в соответствии с обычными правилами языка программирования Java.

Пример 8.1.3-1. Внутренние объявления классов и Stati c членов

class HasStatic {
     static int j = 100;
}
class Outer {
    class Inner extends HasStatic {
         static final int x = 3;  // OK: constant variable
         static int y = 4;  // Compile-time error: an inner class
    }
    static class NestedButNotInner{
        static int z = 5;    // OK: not an inner class
    }
    interface NeverInner {}  // Interfaces are never inner
}
1 голос
/ 10 апреля 2020

Потому что private static final int x = 0; является постоянной времени компиляции. Согласно java do c,

Внутренние классы могут не объявлять элементы stati c, если они не являются постоянными полями времени компиляции

...