На вопрос «почему статические поля внутренних классов должны быть окончательными»:
Это ограничение указано in the JLS как
Внутренние классы не могут объявлять статические члены, если они не являются постоянными переменные (§4.12.4), или возникает ошибка времени компиляции.
Но это не говорит нам, почему. Давайте подумаем о том, как мы используем внутренние классы. Представьте, что я пишу (стараюсь) это.
public class A{
private class B{
static x;
}
public void updateX(int y){
B.x=y;
}
public void printX(){
System.out.println(x);
}
}
Что происходит, когда я делаю это
A one = new A();
A two = new A();
one.doStuff(1);
two.doStuff(2);
one.printX();
two.printX();
Что должно быть напечатано? 1, затем 2 или 2 раза? x является статическим, поэтому он должен существовать только в одном месте (в объекте Klass
B), но поскольку B является внутренним классом, он должен быть специфичным для этого экземпляра A.Если бы мы разрешили статические не окончательные поля, нам нужно было бы создать конкретный экземпляр объекта Klass
для каждого экземпляра внешнего класса. Который мы не хотим делать!
Статические конечные поля, таким образом, разрешены, так как они могут жить в объекте BBсчастливо и быть общими для всех экземпляров внешнего класса, потому что они никогда не могут измениться (будучи окончательными).
Я просто понимаю 'static' и' final', когда класс введен, статическая переменная будет включена, а затем никогда не будет изменена. Вы можете получить доступ к ним внутри своей области. –
Ну, это переменная 'static', как и любая другая, без таинственности здесь – fge
IMO, зачем отличать статические конечные переменные от внутреннего класса или основного класса. Они предназначены для использования таким же образом во внутреннем классе, как и в любом нормальном классе. – RandomQuestion