1.java 代码的执行顺序如下:
开始 ⇒ 父类的静态代码块 ⇒ 子类的静态代码块 ⇒ 父类的普通代码块 ⇒ 父类的构造方法
⇒ 子类的普通代码块 ⇒ 子类的构造方法 ⇒ 结束
注意事项
- 静态代码块 (也就是被关键字 static 修饰的代码块) 只在程序初次运行时执行一次, 也就是说, 无论你实例化 (new) 多少个对象, 静态代码块都只执行一次; 其原因就在于静态代码块只是在类被加载进内存时执行, 而类加载到内存中只需执行一次, 所以静态代码块也就只执行一次.
2. 经过上面的论述, 下面结合代码来理解 java 代码的执行顺序
代码中需要注意的点:
TestDemo5 是继承于 BB 类的; 而 BB 类则继承于 AA 类
那图中的代码运行结果会是怎样呢?
- 代码会先从 main 方法执行, main 是 TestDemo5 这个类的静态方法, 就会触发 TestDemo5 的类
加载.
-
由于 BB 是 TestDemo5 的父类, 那么在加载 TestDemo5 之前, 就会先加载 BB
-
又因为 AA 是 BB 的父类, 那么在加载 BB 之前, 就会先加载 AA
所以总体的加载顺序是: 加载 AA→ 加载 BB→ 加载 TestDemo5→ 执行 main 方法
-
加载 AA 就会调用其中的静态代码块 父类 AA 的静态代码块
-
加载 BB 就会调用 BB 中的静态代码块 子类 BB 的静态代码块
6.TestDemo5 中没有静态代码块, 就执行 main 方法中的内容, 也就是打印 “开始”
7.new BB()
构造 BB 的实例之前会先够造 AA 的实例, 先执行 AA 中的代码块和构造方法; 然后再执行
BB 中的代码块和构造方法
父类 AA 的实例代码块
父类 AA 的构造方法
子类 BB 的实例代码块
子类 BB 的构造方法
- 然后走到 mian 方法的最后一步打印 “结束”
程序执行结果如下:
3. 若在 main 方法中进行两次 newBB(), 其他都不改变的情况下; 那结果会发生怎样的变化呢?
程序运行结果如下:
从运行结果中可以看到; 就算是实例化了两次 BB 类; 但是 AA 类和 BB 类的静态代码块也只是执行
了一次, 这就说明静态代码块只在程序初次运行时执行一次.
4. 如果 TestDemo5 不继承于 BB; 结果又会如何呢?
如果不让 TestDemo 继承 BB; 那么 TestDemo 在进行类加载的时候就不会触发 AA 和 BB 的加载; 就会先进行调用 main 函数; 首先打印 “开始”, 然后在 newBB() 的时候再触发 AA 和 BB 的类加载, 就会按照先加载父类的静态代码块 → 子类静态代码块 → 父类普通代码块 → 父类的构造方法 → 子类的普通代码块 → 子类的构造方法 的顺序执行; 最后打印 “结束”
程序执行结果如下:
希望本博客让您对 java 代码执行顺序的理解有所帮助!!!