Java call base method dal costruttore di base

Come chiamare Super :: printThree da Super :: Super ()?
Nell’esempio seguente, invece, chiamo Test :: printThree.

class Super { Super() { printThree(); // I want Super::printThree here! } void printThree() { System.out.println("three"); } } class Test extends Super { int three = 3 public static void main(String[] args) { Test t = new Test(); t.printThree(); } void printThree() { System.out.println(three); } } output: 0 //Test::printThree from Super::Super() 3 //Test::printThree from t.printThree() 

Non puoi – è un metodo che è stato sovrascritto nella sottoclass; non puoi forzare una chiamata al metodo non virtuale. Se si desidera chiamare un metodo non virtualmente, rendere il metodo privato o definitivo.

In generale è una ctriggers idea chiamare un metodo non finale all’interno di un costruttore proprio per questo motivo – il corpo del costruttore della sottoclass non sarà ancora stato eseguito, quindi stai chiamando in modo efficace un metodo in un ambiente che non è stato completamente inizializzato.

Stai violando l’intera idea alla base del dispacciamento dinamico e dell’eredità qui. Basta non farlo (ed è piuttosto difficile aggirare in java comunque). Rendi invece la funzione privata e / o finale in modo che non possa essere sovrascritta nella class ereditata

Se Super bisogno di garantire che printThree() non sia sovrascritto, quel metodo deve essere dichiarato come final . In alternativa, il metodo di override in Test può decidere di chiamare il metodo sovrascritto se sceglie:

 @Override void printThree() { super.printThree(); } 

Se la class base non segna un metodo come final , sta rinunciando al diritto di non fare in modo che le classi derivanti lo sovrascrivano e fanno ciò che preferiscono.