Consideriamo queste due classi:Inizializzazione ordine dei campi finali
public abstract class Bar {
protected Bar() {
System.out.println(getValue());
}
protected abstract int getValue();
}
public class Foo extends Bar {
private final int i = 20;
public Foo() {
}
@Override
protected int getValue() {
return i;
}
public static void main(String[] args) {
new Foo();
}
}
Se eseguo Foo, l'uscita è 20.
Se faccio il campo non finale, o se inizializzare nel Foo constructor, l'output è 0.
La mia domanda è: qual è l'ordine di inizializzazione in caso di campi finali e dove si trova questo comportamento descritto nella JLS?
Mi aspettavo di trovare qualche regola eccezionale sui campi finali here, ma a meno che non mi manchi qualcosa, non c'è.
Nota che so che non dovrei mai chiamare un metodo overridable da un costruttore. Non è questo il punto della domanda.
Dovevo rimuovere il mio commento su 'final int' essere una costante di tempo * compilazione * (non aveva * prove giustificative * ..Stavo cercando questa risposta .. Grazie). +1: P .. – TheLostMind
Buon punto. Ho perso questo riferimento "variabile costante" (che ossimoro!). Ma non riesco ancora a comprendere appieno le modifiche apportate alla procedura di inizializzazione dell'oggetto. Quando viene assegnata questa variabile costante? La procedura dettagliata di inizializzazione parla dell'inizializzazione della classe e parla dell'inizializzazione delle "variabili finali della classe", ma non sull'inizializzazione delle "variabili di istanza finali" (a meno che non manchi di nuovo qualcosa). –
OK. L'ho trovato. http://docs.oracle.com/javase/specs/jls/se8/html/jls-15.html#jls-15.2 dice: "Alcune espressioni hanno un valore che può essere determinato al momento della compilazione, che sono espressioni costanti (§15.28). ". E http://docs.oracle.com/javase/specs/jls/se8/html/jls-15.html#jls-15.28 dice che "Nomi semplici (§6.5.6.1) che si riferiscono a variabili costanti (§4.12. 4) "sono espressioni costanti. Quindi 'i' in' getValue() 'è un nome semplice che si riferisce a una variabile costante, e il suo valore è quindi noto in fase di compilazione. –