Dire un projet contient plusieurs classes, dont chacune a un initialiseur statique bloc. Dans quel ordre ces blocs exécuter? Je sais que dans une classe, ces blocs sont exécutés dans l'ordre où ils apparaissent dans le code. J'ai lu que c'est la même chose dans des classes, mais des exemples de code que j'ai écrit n'est pas d'accord avec ça. J'ai utilisé ce code:
package pkg;
public class LoadTest {
public static void main(String[] args) {
System.out.println("START");
new Child();
System.out.println("END");
}
}
class Parent extends Grandparent {
// Instance init block
{
System.out.println("instance - parent");
}
// Constructor
public Parent() {
System.out.println("constructor - parent");
}
// Static init block
static {
System.out.println("static - parent");
}
}
class Grandparent {
// Static init block
static {
System.out.println("static - grandparent");
}
// Instance init block
{
System.out.println("instance - grandparent");
}
// Constructor
public Grandparent() {
System.out.println("constructor - grandparent");
}
}
class Child extends Parent {
// Constructor
public Child() {
System.out.println("constructor - child");
}
// Static init block
static {
System.out.println("static - child");
}
// Instance init block
{
System.out.println("instance - child");
}
}
et a obtenu ce résultat:
DÉMARRER
statique - grands-parents
statique - parent
statique - enfant
exemple - grands-parents
constructeur - grands-parents
exemple - parent
constructeur - parent
exemple - enfant
constructeur - enfant
FIN
La réponse évidente est que les blocs de courir avant de leurs enfants, mais qui pourrait n'être qu'une coïncidence et n'aide pas si les deux classes ne sont pas dans la même hiérarchie.
EDIT:
J'ai modifié mon code en exemple par l'ajout de ce à LoadTest.java:
class IAmAClassThatIsNeverUsed {
// Constructor
public IAmAClassThatIsNeverUsed() {
System.out.println("constructor - IAACTINU");
}
// Instance init block
{
System.out.println("instance - IAACTINU");
}
// Static init block
static {
System.out.println("static - IAACTINU");
}
}
Comme le laisse entendre le nom de la classe, je n'ai jamais fait référence à la nouvelle classe n'importe où. Le nouveau programme produit le même résultat que l'ancien.