首页 > 编程语言 >Java类加载机制和执行顺序

Java类加载机制和执行顺序

时间:2024-02-20 15:47:21浏览次数:29  
标签:初始化 顺序 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类的初始化顺序如下:

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

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

标签:初始化,顺序,Java,构造方法,静态,成员,执行,代码,加载
From: https://www.cnblogs.com/itcq1024/p/18023238

相关文章

  • 【Java】java线程的六种状态
          一、新建状态(NEW)即用new关键字新建一个线程,这个线程就处于新建状态。二、运行状态(RUNNABLE)操作系统中的就绪和运行两种状态,在Java中统称为RUNNABLE。 就绪状态(READY)当线程对象调用了start()方法之后,线程处于就绪状态,就绪意味着该线程......
  • 使用Java将视频中某一帧抽取为封面图片
    由于业务需求需将视频中的某帧进行截取作为该视频封面,网上太多教程过于复杂麻烦,经本人研究发现可以使用Java调用FFmpeg来进行处理。/***获取指定的视频文件后进行封面截图为png并保存到指定目录**@paramvideoFile视频媒体文件*@paramfileName文件名*/publicS......
  • native-lib-loader java native 库的java 包
    native-lib-loader可以方便native库的查找,只要我们的c库符合格式,基于native-lib-loader就可以方便的进行包的加载参考c库jar格式/natives/linux_32libxxx[-vvv].so/linux_64libxxx[-vvv].so/osx_32libxxx[-vvv].dylib......
  • C#和Java Model的区别
    下面是一个简单的患者类示例,分别使用C#和Java实现,包含患者ID和姓名属性:C#示例:publicclassPatient{//患者ID属性publicintPatientId{get;set;}//姓名属性publicstringName{get;set;}//构造函数publicPatient(intpa......
  • 手动将一个java程序打包成jar包
    1.目录结构新建三个目录:bin,META-INF,src src目录下存放源码 META-INF目录下存放MANIFEST.MF bin目录下存放.class文件 2.编译源码javac-dbinsrc/DESUtil.java 3.在META-INF目录下新建MANIFEST.MF文件Manifest-Version:1.0Main-Class:DESUtilClass-......
  • Java实现静态链表
    本文参照了大话数据结构的静态链表的c语言实现packagecom.luoyi.list;/***@Description静态链表*@AuthorLuoyi*@Date2024/2/19**注:1.索引为0的节点不存放数据,cur指向第一个空闲节点的下标*2.最后一个元素(即下标Maxsize-1)的cur指向第一个有效数......
  • 「Java开发指南」MyEclipse如何支持Spring Scaffolding?(三)
    在上文中主要为大家介绍了CRUDScaffolding,本文将继续介绍应用程序的分层、代码助手等。MyEclipsev2023.1.2离线版下载MyEclipse技术交流群:742336981欢迎一起进群讨论3.应用程序的分层应用程序分层是应用程序开发领域中非常常见的体系结构方法,应用程序分层包括将应用程序代......
  • Java SE 完结心得
    昨天刚看完JavaSE的最后一节课,Java基础阶段将近花费了35天的时间,这个时间相对来说是比较长的。整个阶段学习状态也是断断续续的,没有每天按时的学习,经常是今天学完,明天不学了。下面开始学习Javaweb的时候,要及时的调整自己的状态。不能每天在满不在乎的了。基础阶段跟的是黑马......
  • java1.8LocalDate日期常用函数
    LocalDatenow=LocalDate.now();//获取当前日期2023-12-31Stringformat=LocalDateTime.now().format(DateTimeFormatter.ofPattern("yyyy-MM-ddHH:mm:ss"));//获取当前时间2023-12-3115:44:52intmonthValue=now.getMonthValue();//返回当前的月份intdayOfMonth=now.......
  • el-cascader 动态加载,编辑时数据回显
    参考链接:https://blog.csdn.net/qq_16382227/article/details/129735904业务:只有选择了关联摄像头以后才能显示出选择预置位,关联摄像头是联级逐次触发掉接口加载的,后续还需要回显。html:     <el-cascader      v-model="ruleForm.cameraTree"  ......