静态初始化模块执行顺序

测试静态初始化模块执行顺序的程序:

 1 class Root
 2 {
 3     static{
 4         System.out.println("Root的静态初始化块");
 5     }
 6     {
 7         System.out.println("Root的普通初始化块");
 8     }
 9     public Root()
10     {
11         System.out.println("Root的无参数的构造器");
12     }
13 }
14 class Mid extends Root
15 {
16     static{
17         System.out.println("Mid的静态初始化块");
18     }
19     {
20         System.out.println("Mid的普通初始化块");
21     }
22     public Mid()
23     {
24         System.out.println("Mid的无参数的构造器");
25     }
26     public Mid(String msg)
27     {
28         //通过this调用同一类中重载的构造器
29         this();
30         System.out.println("Mid的带参数构造器,其参数值:" + msg);
31     }
32 }
33 class Leaf extends Mid
34 {
35     static{
36         System.out.println("Leaf的静态初始化块");
37     }
38     {
39         System.out.println("Leaf的普通初始化块");
40     }
41     public Leaf()
42     {
43         //通过super调用父类中有一个字符串参数的构造器
44         super("Java初始化顺序演示");
45         System.out.println("执行Leaf的构造器");
46     }
47
48 }
49
50 public class TestStaticInitializeBlock
51 {
52     public static void main(String[] args)
53     {
54         new Leaf();
55
56
57     }
58 }

运行结果如下:

Root的静态初始化块
Mid的静态初始化块
Leaf的静态初始化块
Root的普通初始化块
Root的无参数的构造器
Mid的普通初始化块
Mid的无参数的构造器
Mid的带参数构造器,其参数值:Java初始化顺序演示
Leaf的普通初始化块
执行Leaf的构造器

先执行Static的初始化方法,然后执行普通初始化方法,之后是无参的构造器,其次有参的构造器。

结论:首先执行的是父类静态初始化模块,然后是子类静态初始化模块,然后再是由父类到子类依次执行普通、无参、有参的构造器。

1.static静态初始化块只执行一次

2.在执行子类的静态初始化块时会调用父类的静态初始化块。

原文地址:https://www.cnblogs.com/cxy0210/p/11684846.html

时间: 2024-11-08 20:54:59

静态初始化模块执行顺序的相关文章

JVM 类加载过程、初始化、主动引用、被动引用、静态初始化块执行顺序

nginx开发笔记_Filter模块执行顺序

Filter模块执行顺序 Filter模块的执行顺序是在执行configure文件时决定的,configure文件执行完成后生成objs/ngx_modules.c,文件中定义了一个数组ngx_module_t *ngx_modules[],数组的顺序就是模块执行顺序的逆序. 一般而言,在模块的config文件中配置ngx_module_type为HTTP_FILTER后生成的默认执行顺序在ngx_http_copy_filter_module之后. 一个典型的ngx_module_t *ngx

静态代码块、静态变量等执行顺序

1 public class BasicTest { 2 public static void main(String[] args) { 3 System.out.println("m1:"); 4 Mimi m1=new Mimi(); 5 System.out.println("m2:"); 6 Mimi m2=new Mimi(); 7 } 8 } 9 10 class Mimi { 11 public static int si=0; 12 int di=

Java中普通代码块,构造代码块,静态代码块执行顺序

执行顺序:(优先级从高到低.)静态代码块>mian方法>构造代码块>构造方法. 其中静态代码块只执行一次.构造代码块在每次创建对象是都会执行. static块,普通代码块,构造代码块执行顺序 class A{ public A(){ System.out.println("Hello A"); } { System.out.println("block A"); } static{ System.out.println("static A

java JVM-类加载静态初始化块调用顺序

测试类加载的全过程 public class Have { static { System.out.println("加载Have");//先加载Have再调用main方法 } public static void main(String[] args) throws Exception { System.out.println("main方法"); //先调main方法 A a=new A(); //先初始化父类,再初始化子类 System.out.println

java初始化的执行顺序

Java初始化(initialization)其实包含两部分: 1.类的初始化(initialization class & interface)2.对象的创建(creation of new class instances).因为类的初始化其实是类加载(loading of classes)的最后一步,所以很多书中把它归结为“对象的创建”的第一步.其实只是看问题的角度不同而已.为了更清楚的理解,这里还是分开来. 顺序:应为类的加载肯定是第一步的,所以类的初始化在前.大体的初始化顺序是:类初始化

Java--普通代码块静态代码块执行顺序

1 class B { 2 3 public B() { 4 super(); 5 System.out.println("构造器B"); 6 } 7 { 8 System.out.println("普通的代码块B"); 9 } 10 static{ 11 System.out.println("静态代码块B"); 12 } 13 14 } 15 public class ClassA extends B { 16 17 public Class

Java 静态代码块执行顺序

public class Test1 {public static int k=0;public static Test1 t1 = new Test1("t1");public static Test1 t2 = new Test1("t2");public static int i = print("i");public static int n = 99;public static int j = print("j");

关于静态块、静态属性、构造块、构造方法的执行顺序

总结: 1.类加载时,执行静态代码块和初始化静态变量.执行顺序跟代码顺序一致. 2.类实例化时,初始化变量.执行代码块.执行构造.其中初始化变量和代码块的顺序跟代码顺序一致.执行构造是在最后. 3.实例化子类时,会先调用父类的构造方法.调用构造方法之前,会先执行该类的代码块. 4.类只会加载一次. 5.静态变量或静态方法中如果调用构造,可以把构造当做一个普通方法来看.但会先执行一遍代码块. 下面是在网上找到的比较典型的例子,以此来说明 例一: class A { static { System.