2013-06-13 2 views
1

Я знаю, что это можно сделать следующее:Почему статические конечные переменные принимаются во внутренних классах?

public class Indeed{ 
    private class inner { 
     static final int try1 = 10; 
    } 
} 

Почему? в чем смысл допускать такое заявление? Кроме того, это еще можно сделать то же самое в местном классе:

public void doThing() { 
    class LocalClass { 
     static final int try1 = 10; 
    } 
} 

Что толку статический финал в этих битов кода? Я уверен, что никогда не буду использовать их, однако мне нужно понять, почему они используются, поскольку у меня есть экзамен OCPJP7.

Заранее спасибо.

+0

Я просто понимаю 'static' и' final', когда класс введен, статическая переменная будет включена, а затем никогда не будет изменена. Вы можете получить доступ к ним внутри своей области. –

+3

Ну, это переменная 'static', как и любая другая, без таинственности здесь – fge

+0

IMO, зачем отличать статические конечные переменные от внутреннего класса или основного класса. Они предназначены для использования таким же образом во внутреннем классе, как и в любом нормальном классе. – RandomQuestion

ответ

3

Цель статической переменной должна использоваться всеми экземплярами класса. В обоих примерах вы можете иметь несколько экземпляров вашего частного класса/локального класса, поэтому, как указано, они будут совместно использовать статические переменные среди экземпляров. Было бы бессмысленно, если бы вы могли только создать экземпляр своего класса один раз.

JLS 8.1.3. : Inner Classes and Enclosing Instances

Внутренние классы не могут объявлять статические члены, если они не являются постоянными переменных (§4.12.4), или происходит ошибка во время компиляции.

Как я вижу его в спецификации, не имея ответа на следующую дилемму:

  • статические переменные внутреннего класса являются общими среди всех экземпляров одного и того же внешнего экземпляра класса (но они могут иметь разные значения из экземпляра внешнего класса в другой).
  • Статические переменные внутреннего класса распределяются между всеми существующими экземплярами виртуальной машины независимо от их экземпляров внешнего класса.

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

+0

Почему с окончанием разрешено? – Rollerball

1

На вопрос «почему статические поля внутренних классов должны быть окончательными»:

Это ограничение указано 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счастливо и быть общими для всех экземпляров внешнего класса, потому что они никогда не могут измениться (будучи окончательными).

Смежные вопросы