L'utilisation de blocs de code statiques et de lumières constantes statiques d'une classe ne dépend pas du chargement de la classe. Autrement dit, l’utilisation d’une variable statique d’une classe ne déclenchera pas le chargement de cette classe.
/**
* Created by gongxufan on 3/31/16.
*/
class Parent{
public static final String const_str = "Super";
static{
System.out.println("Super Class Init");
}
public Parent(){
System.out.println("Super Class Init");
}
}
class Child extends Parent{
public static final String const_str_child = "Super";
static {
System.out.println("Child Class Init");
System.out.println(const_str);
}
}
public class SuperClassInit {
public static void main(String[] args) {
System.out.println(Child.const_str);
}
}
Lors du chargement d'une sous-classe, la classe parent sera définitivement chargée. Dans la séquence de chargement de la JVM, la classe parent doit être chargée en premier, puis la sous-classe est initialisée.
Si je me souviens bien, l'ordre est : variables statiques de la classe parent - blocs de code statiques de la classe parent - variables statiques de la sous-classe - blocs de code statiques de la sous-classe. Je me suis peut-être mal souvenu de la commande.
Le chargement d'une sous-classe chargera d'abord la classe parent J'ai écrit le code ci-dessous : Super
public class Super
{
public static final int FIELD = 1;
public static int FILED1 = 2;
static {
System.out.println("Super");
}
}
Sous
public class Sub extends Super
{
static {
System.out.println("out main");
}
public static void main(String[] args)
{
System.out.println(FIELD);
System.out.println(FILED1);
}
}
Le résultat est :
Super
sortie principale 1 2
La classe parent sera chargée. De quel problème parlez-vous ?
public class Demo {
public static void main(String[] args) {
System.out.println(Child.const_str);
System.out.println(Child.const_str_child);
}
}
class Parent{
public static final String const_str = "P";
static{
System.out.println("P Init");
}
}
class Child extends Parent{
public static final String const_str_child = "C";
static {
System.out.println("C Init");
}
}
Exécuter les résultats :
P
C
Remarque :
public class Demo {
public static void main(String[] args) {
System.out.println(Child.const_str);
System.out.println(Child.const_str_child);
}
}
class Parent{
public static String const_str = "P";
static{
System.out.println("P Init");
}
}
class Child extends Parent{
public static String const_str_child = "C";
static {
System.out.println("C Init");
}
}
Supprimez la finale de la constante, le résultat sera :
P Init
P
C Init
C
jdk1.8 La raison pour laquelle cela se produit est que final est optimisé au moment de la compilation en raison de son immuabilité. System.out.println(Child.const_str) pointe directement vers la chaîne dans le pool constant après l'emplacement de la compilation. dans.
L'utilisation de blocs de code statiques et de lumières constantes statiques d'une classe ne dépend pas du chargement de la classe. Autrement dit, l’utilisation d’une variable statique d’une classe ne déclenchera pas le chargement de cette classe.
Lors du chargement d'une sous-classe, la classe parent sera définitivement chargée.
Dans la séquence de chargement de la JVM, la classe parent doit être chargée en premier, puis la sous-classe est initialisée.
Si je me souviens bien, l'ordre est : variables statiques de la classe parent - blocs de code statiques de la classe parent - variables statiques de la sous-classe - blocs de code statiques de la sous-classe. Je me suis peut-être mal souvenu de la commande.
Le chargement d'une sous-classe chargera d'abord la classe parent
J'ai écrit le code ci-dessous :
Super
Sous
Le résultat est :
sortie principale
1
2
La classe parent sera chargée. De quel problème parlez-vous ?
Supplément :
Exécuter les résultats :
Remarque :
Supprimez la finale de la constante, le résultat sera :
jdk1.8
La raison pour laquelle cela se produit est que final est optimisé au moment de la compilation en raison de son immuabilité. System.out.println(Child.const_str) pointe directement vers la chaîne dans le pool constant après l'emplacement de la compilation. dans.