这里有新鲜出炉的 Java 并发编程示例,程序狗速度看过来!
java 是一种可以撰写跨平台应用软件的面向对象的程序设计语言,是由 Sun Microsystems 公司于 1995 年 5 月推出的 Java 程序设计语言和 Java 平台(即 JavaEE(j2ee), JavaME(j2me), JavaSE(j2se))的总称。
这篇文章主要介绍了举例说明 Java 中代码块的执行顺序, 需要的朋友可以参考下
Java 中代码的加载顺序所能了解的知识点
类的依赖关系
static 代码块的加载时间
继承类中构造器的隐式调用
非 static 的成员变量初始化时间
main 方法和 static 的加载顺序
测试代码如下:
- public class App {
- private static App d = new App();
- private SubClass t = new SubClass();
- static {
- System.out.println("App static"); //6
- }
- public App() {
- System.out.println("构建App"); //5
- }
- public static void main(String[] args) {
- System.out.println("App main"); //7
- }
- }
- //父类
- class SuperClass {
- static {
- System.out.println("SuperClass static"); //1
- }
- SuperClass() {
- System.out.println("构建SuperClass"); //3
- }
- }
- //子类
- class SubClass extends SuperClass {
- static {
- System.out.println("SubClass static"); //2
- }
- public SubClass() {
- //super()
- System.out.println("构建SubClass"); //4
- }
- }
输出结果
- SuperClass static
- SubClass static
- 构建SuperClass
- 构建SubClass
- 构建App
- App static
- App main
分析
因为在 App 类中, 声明了 SubClass 的变量, 所以 JVM 先加载 SubClass 类, 不然无法编译 App。
SubClass 是 SuperClass 的子类, 在继承关系的类中, 父类先加载进 JVM, 不然子类无法编译。
在类中 static 代码会在字节码文件加载进 JVM 的时候调用一次, 且在该类的生命周期中只会调用一次。所以在第一行输出的是 SuperClass static, 随后 SubClass 加载进了 JVM, 输出第二行的 SubClass static
声明的 static 成员变量, 其初始化是在 static 代码块中。非 static 成员变量, 其初始化是在构造器中, 且是在构造器的代码前面。
创建静态的成员变量 d 之前会先创建成员变量 t, 在 SubClass 的构造器中会隐式的使用 super() 调父类的构造器, 所以第三行输出构建 SuperClass, 第四行输出 SubClass。
在 App 的构造器中创建好了成员变量 t 后, 向下执行, 输出第五行的构建 App。
随后继续执行 App 的静态代码块 (因为 d 是 static 的变量, 所以并不是说 App 的构造器比 static 先执行), 输出第六行的 App static。
最后执行 public 类的入口方法 main, 输出第七行的 App main。
希望本篇文章对您有所帮助
来源: http://www.phperz.com/article/17/1220/357513.html