1.java 代码的执行顺序如下:

开始 父类的静态代码块 子类的静态代码块 父类的普通代码块 父类的构造方法

子类的普通代码块 子类的构造方法 结束

注意事项

  1. 静态代码块 (也就是被关键字 static 修饰的代码块) 只在程序初次运行时执行一次, 也就是说, 无论你实例化 (new) 多少个对象, 静态代码块都只执行一次; 其原因就在于静态代码块只是在类被加载进内存时执行, 而类加载到内存中只需执行一次, 所以静态代码块也就只执行一次.

2. 经过上面的论述, 下面结合代码来理解 java 代码的执行顺序

代码中需要注意的点:

TestDemo5 是继承于 BB 类的; 而 BB 类则继承于 AA 类

那图中的代码运行结果会是怎样呢?

  1. 代码会先从 main 方法执行, main 是 TestDemo5 这个类的静态方法, 就会触发 TestDemo5 的类

加载.

  1. 由于 BB 是 TestDemo5 的父类, 那么在加载 TestDemo5 之前, 就会先加载 BB

  2. 又因为 AA 是 BB 的父类, 那么在加载 BB 之前, 就会先加载 AA

所以总体的加载顺序是: 加载 AA 加载 BB 加载 TestDemo5 执行 main 方法

  1. 加载 AA 就会调用其中的静态代码块  父类 AA 的静态代码块

  2. 加载 BB 就会调用 BB 中的静态代码块 子类 BB 的静态代码块

6.TestDemo5 中没有静态代码块, 就执行 main 方法中的内容, 也就是打印  “开始”

7.new BB()

构造 BB 的实例之前会先够造 AA 的实例, 先执行 AA 中的代码块和构造方法; 然后再执行

BB 中的代码块和构造方法

父类 AA 的实例代码块

父类 AA 的构造方法

子类 BB 的实例代码块

子类 BB 的构造方法

  1. 然后走到 mian 方法的最后一步打印 “结束”

程序执行结果如下:

3. 若在 main 方法中进行两次 newBB(), 其他都不改变的情况下; 那结果会发生怎样的变化呢?

程序运行结果如下:

 从运行结果中可以看到; 就算是实例化了两次 BB 类; 但是 AA 类和 BB 类的静态代码块也只是执行

了一次, 这就说明静态代码块只在程序初次运行时执行一次.

 4. 如果 TestDemo5 不继承于 BB; 结果又会如何呢?

 如果不让 TestDemo 继承 BB; 那么 TestDemo 在进行类加载的时候就不会触发 AA 和 BB 的加载; 就会先进行调用 main 函数; 首先打印 “开始”, 然后在 newBB() 的时候再触发 AA 和 BB 的类加载, 就会按照先加载父类的静态代码块 子类静态代码块 父类普通代码块 父类的构造方法 子类的普通代码块 子类的构造方法 的顺序执行; 最后打印 “结束”

程序执行结果如下:

希望本博客让您对 java 代码执行顺序的理解有所帮助!!!