Bloc de code statique, variable membre statique -> bloc de code non statique, variable membre non statique -> nouveaux autres objets appellent la méthode de construction d'objet correspondante (en dehors de la méthode du local object Y compris le constructeur) -> le nouvel objet local appelle le constructeur.
【Remarque : S'il y a un nouvel objet, il y a des blocs de code statiques et des blocs de code non statiques dans l'objet. Chaque fois que l'objet est nouveau, le bloc de code non statique sera exécuté une fois, mais le bloc de code statique. Le bloc de code ne sera exécuté qu'une seule fois, puis le nouvel objet sera exécuté. Il ne sera pas exécuté à nouveau. 】
Bloc de code statique de classe parent (variable statique > bloc statique) > Bloc de code statique de sous-classe > Définition de différents blocs de code
class Demo{ static { //静态代码块...... } }Caractéristiques : 1. Le code dans le bloc de code statique Java s'exécutera lorsque la classe chargera la JVM et ne sera exécuté qu'une seule fois 2. Les blocs statiques sont souvent utilisés pour l'exécution Initialisation des attributs de classe et certains travaux d'initialisation globale 3. Les blocs statiques ont priorité sur divers blocs de code et constructeurs. S'il y a plusieurs blocs de code statiques dans une classe, ils seront exécutés séquentiellement dans l'ordre d'écriture 4. Les blocs de code statiques peuvent. être défini n'importe où dans la classe, sauf dans le corps de la méthode [le corps de la méthode ici est n'importe quel corps de méthode] 5. Les blocs de code statiques ne peuvent pas accéder aux variables ordinaires
Les blocs de code statiques seront présentés en détail
Étant donné que la JVM exécutera le bloc de code statique lors du chargement de la classe, le bloc de code statique est exécuté avant la méthode principale. Si la classe contient plusieurs blocs de code statiques, alors le code défini en premier sera exécuté en premier et le code défini ultérieurement sera exécuté. [Remarque : 1 Les blocs de code statiques ne peuvent exister dans aucun corps de méthode. 2 Les blocs de code statiques ne peuvent pas accéder directement aux variables d'instance statiques et aux méthodes d'instance. Ils doivent être accessibles via l'objet d'instance de la classe. 】 Bloc de code d'instance Le bloc de code d'instance est également appelé bloc d'initialisation de construction, bloc de code de construction et bloc d'initialisation.
class Demo{ { //实例代码块...... } }Caractéristiques :
class Demo{ public void test(){ { //局部代码块...... } } }Caractéristiques : 1. Ordinaire Le bloc de code est défini dans le corps de la méthode 2. Le format du bloc de code ordinaire et du bloc de code d'instance sont les mêmes que {} 3. Le seul La différence directement visible entre le bloc de code ordinaire et le bloc de code construit est que le bloc de code construit est défini dans la classe. Les blocs de code ordinaires sont définis dans le corps de la méthode 4. Le cycle de vie des variables peut être limité, publié plus tôt et amélioré. Utilisation de la mémoire. Vérifiez l'ordre d'exécution de chaque bloc de code. L'exemple de code est le suivant :
Code de test Comme suit :class Init { public Init() { System.out.println("无参构造器"); } public Init(int a) { System.out.println("有参构造器"); } { System.out.println("实例代码块1"); } { System.out.println("实例代码块2"); } { System.out.println("实例代码块3"); } static { System.out.println("静态初始化块1"); } static { System.out.println("静态初始化块2"); } public void method(){ { System.out.println("普通初始化块"); } } }
class Demo { public static void main(String[] args) { Init init1 = new Init(); init1.method(); System.out.println("------------"); Init init2 = new Init(); init2.method(); //多打印几个对象的目的是:方便看出Static静态代码块 是否只执行一次!!! System.out.println("------------"); Init init3 = new Init(); init3.method(); } }
Les résultats d'exécution sont les suivants :
Conclusion :
L'ordre d'exécution est : bloc de code statique> bloc de code d'instance> constructeur> bloc de code ordinaire,
Et le bloc de code statique sera appelé lorsque la classe est chargée, et appelé une seule fois (exécuté en tant que classe est chargé).
Alors quand le cours sera-t-il chargé ?
- Lors de la création d'une instance d'objet (nouveau)- Lors de la création d'une instance d'objet de sous-classe, la classe parent sera également chargée - Lors de l'utilisation de membres statiques de la classe (propriétés statiques, méthodes statiques)
Vérifier l'existence de chaque bloc de code dans la relation d'héritage La séquence d'exécutionpar exemple, la relation d'héritage estConclusion :Trois——> Deux——>
D'après les résultats de l'exécution, on peut voir que l'héritage de plusieurs classes Il existe des blocs d'initialisation, des blocs d'initialisation statiques et des constructeurs. L'ordre d'exécution réel est le suivant : exécuter les blocs statiques de la classe parent A, les blocs statiques de. classe parent B, et enfin les blocs statiques de la sous-classe, puis exécutez les blocs de code d'instance de la classe parent A. et le constructeur, puis le bloc de code d'instance et le constructeur de la classe B, et enfin exécutez le bloc de code d'instance et le constructeur de la sous-classe C [Remarque : ABC correspond ici à Un, Deux, Trois]
L'ordre d'exécution des blocs d'initialisation, des blocs d'initialisation statiques et des constructeurs dans l'héritage de plusieurs classes est :
父类静态块——>子类静态块——>父类实例代码块——>父类构造器——>子类实例代码块——>子类构造器 ——>(如果有局部代码块, 再正常执行即可, 这里就没必要进行测试了) 我们那一段代码作为例子说明下,代码如下: 接下来让我们看看 , Init.java编译完的的字节码文件(Init.class) 从这个字节码文件就可以很清晰的看出, 实例代码块实际上是被依次放到了构造方法的第一句, 所以可以的出此结论: 实例代码块的执行顺序是优先于构造器的。通过字节码深究实例代码块优先于构造器原因
class Init {
public Init() {
System.out.println("无参构造器");
}
public Init(int a) {
System.out.println("有参构造器");
}
{
System.out.println("实例代码块1");
}
{
System.out.println("实例代码块2");
}
{
System.out.println("实例代码块3");
}
static {
System.out.println("静态初始化块1");
}
static {
System.out.println("静态初始化块2");
}
public void method(){
{
System.out.println("普通初始化块");
}
}
}
Ce qui précède est le contenu détaillé de. pour plus d'informations, suivez d'autres articles connexes sur le site Web de PHP en chinois!