• 博客园logo
  • 会员
  • 众包
  • 新闻
  • 博问
  • 闪存
  • 赞助商
  • HarmonyOS
  • Chat2DB
    • 搜索
      所有博客
    • 搜索
      当前博客
  • 写随笔 我的博客 短消息 简洁模式
    用户头像
    我的博客 我的园子 账号设置 会员中心 简洁模式 ... 退出登录
    注册 登录

奋斗的软件工程师

  • 博客园
  • 联系
  • 订阅
  • 管理

公告

View Post

Java类加载机制和执行顺序

下面代码运行结果为——

点击查看代码
package com.itcq.d5;

public class App {
    public static void main(String[] args) {
        new B();
    }
}


class A {
    static{
        System.out.println("Static-A执行了~~~");
    }

    {
        System.out.println("代码块-A执行了~~~");
    }

    public A(){
        System.out.println("构造方法-A执行了~~~");
    }
}

class B extends A {
    static C c=new C();
    static{
        System.out.println("Static-B执行了~~~");
    }

    {
        System.out.println("代码块-B执行了~~~");
    }
    public B(){
        System.out.println("构造方法-B执行了~~~");
    }
}

class C {
    public C(){
        System.out.println("构造方法-C执行了~~~");
    }
}

运行结果:

Static-A执行了~~~
构造方法-C执行了~~~
Static-B执行了~~~
代码块-A执行了~~~
构造方法-A执行了~~~
代码块-B执行了~~~
构造方法-B执行了~~~

考察的知识点:

  • 类的初始化顺序:
    • 静态成员变量:首先初始化
    • 静态代码块:其次初始化
    • 实例成员变量:在构造器中初始化
    • 实例代码块:在构造器中,实例成员变量初始化之后执行
    • 构造器:最后执行
  • 继承:
    • 子类会继承父类的静态成员和实例成员
    • 子类在初始化时,会先初始化父类的静态成员和实例成员,然后再初始化自己的成员

首先,JVM会加载App类,并初始化其静态成员变量。由于App类没有静态成员变量,所以这一步没有任何输出。
接着,JVM会加载B类,并初始化其静态成员变量。B类有一个静态成员变量c,它是一个C类的实例。因此,JVM会先初始化C类,然后初始化c。C类的初始化过程如下:
执行C类的静态代码块,输出Static-C执行了~。
由于C类没有非静态成员变量和代码块,所以这一步没有任何输出。
执行C类的构造方法,输出构造方法-C执行了
~。
然后,JVM会初始化B类的其他成员变量。由于B类没有非静态成员变量,所以这一步没有任何输出。
接着,JVM会执行B类的构造方法。B类的构造方法会执行以下操作:
调用父类的构造方法,即A类的构造方法。
执行B类自己的代码块。
执行B类自己的构造函数体。
由于A类是B类的父类,所以JVM会先初始化A类。A类的初始化过程如下:
执行A类的静态代码块,输出Static-A执行了~。
由于A类没有非静态成员变量,所以这一步没有任何输出。
执行A类的构造方法,输出构造方法-A执行了
~。
最后,JVM会执行B类的代码块,输出代码块-B执行了~~~。
总结:

Java类的初始化顺序如下:

静态成员变量
非静态成员变量
代码块
构造方法

对于继承关系,子类的初始化会在父类的初始化之后进行

posted on 2024-02-20 15:32  周政然  阅读(25)  评论(0)    收藏  举报

刷新页面返回顶部
 
博客园  ©  2004-2025
浙公网安备 33010602011771号 浙ICP备2021040463号-3