Java对象初始化过程代码块和构造器的调用顺序

对于Java对象的初始化过程,可以分为三个步骤:成员变量的初始化、代码块的初始化和构造器的初始化。这三个步骤的执行顺序如下:

  1. 父类的成员变量初始化。
  2. 父类的静态代码块初始化。
  3. 子类的成员变量初始化。
  4. 子类的静态代码块初始化。
  5. 父类的代码块初始化。
  6. 父类的构造器初始化。
  7. 子类的代码块初始化。
  8. 子类的构造器初始化。

其中,静态代码块是在类加载时执行,只会执行一次,而普通代码块和构造器是在对象的创建过程中执行的。

下面通过两个示例说明Java对象初始化过程中代码块和构造器的调用顺序:

示例1:

public class Test {
    static {
        System.out.println("静态代码块");
    }

    {
        System.out.println("代码块");
    }

    public Test() {
        System.out.println("构造器");
    }

    public static void main(String[] args) {
        new Test();
    }
}

执行上面的代码,输出结果如下:

静态代码块
代码块
构造器

可以看到,静态代码块先于所有代码块和构造器执行,代码块在构造器之前执行。

示例2:

public class Father {
    static {
        System.out.println("父类静态代码块");
    }

    {
        System.out.println("父类代码块");
    }

    public Father() {
        System.out.println("父类构造器");
    }
}

public class Son extends Father {
    static {
        System.out.println("子类静态代码块");
    }

    {
        System.out.println("子类代码块");
    }

    public Son() {
        System.out.println("子类构造器");
    }

    public static void main(String[] args) {
        new Son();
    }
}

执行上面的代码,输出结果如下:

父类静态代码块
子类静态代码块
父类代码块
父类构造器
子类代码块
子类构造器

可以看到,父类的静态代码块和父类的构造器先于子类的代码块和子类的构造器执行。

本站文章如无特殊说明,均为本站原创,如若转载,请注明出处:Java对象初始化过程代码块和构造器的调用顺序 - Python技术站

(0)
上一篇 2023年6月20日
下一篇 2023年6月20日

相关文章

  • jenkins可用的grafana模板

    Jenkins可用的Grafana模板 简介 Jenkins是一个流行的开源CI/CD工具,用于自动化构建、测试和部署应用程序。Grafana是一个数据可视化工具,用于创建漂亮的仪表盘并监控系统性能。本文将介绍如何创建Jenkins可用的Grafana模板,以监控其构建和测试的结果。 插件安装 在Jenkins服务器上安装Prometheus插件,以便将指标…

    其他 2023年3月28日
    00
  • 小米手机频繁自动重启怎么回事该怎么办

    小米手机频繁自动重启问题解决方案 问题描述 小米手机频繁自动重启问题是指在正常使用手机的过程中,手机自动重启,给用户带来不便。这个问题严重影响用户体验,常见于软件问题或硬件问题。 分析原因 小米手机频繁自动重启问题的原因可以是多种,常见的原因包括: 系统软件问题 第三方应用问题 手机硬件问题 解决方案 针对小米手机频繁自动重启问题,我们可以采用以下方法进行解…

    other 2023年6月27日
    00
  • 【ruby】ruby安装

    以下是关于“【Ruby】Ruby安装”的完整攻略,包括基本概念、安装方法和两个示例。 基本概念 Ruby是一种面向对象的动态编程语言,具有简单、易、高效、灵活等特点,被广泛应用于Web开发、系统管理、数据处理等领域。在安装Ruby之前,需要先安装Ruby的运行环境,即Ruby解释器。 安装方法 以下是在不同操作系统上安装的方法: 在Windows上安装Rub…

    other 2023年5月7日
    00
  • svg使用marker画箭头(一)

    SVG使用marker画箭头(一) SVG是一种基于XML的矢量图形格式,可用于创建图形和动画效果。使用SVG,我们可以轻松地在网页上创建高质量的矢量图形,如任意线条、多边形、矩形、圆形等。本文将介绍如何使用marker属性在SVG中画箭头。 Marker属性介绍 Marker是SVG中一个非常有用的属性,它允许我们定义一个图形,在其他元素中引用并重复使用。…

    其他 2023年3月29日
    00
  • java如何实现获取客户端ip地址的示例代码

    获取客户端IP地址是Java Web开发中常见的需求之一。下面是一份完整的攻略,包含了两个示例说明。 示例1:使用HttpServletRequest对象获取客户端IP地址 在Java Web开发中,可以使用HttpServletRequest对象来获取客户端IP地址。以下是一个示例代码: import javax.servlet.http.HttpServ…

    other 2023年7月31日
    00
  • Win11/10热跳闸错误怎么修复? 电脑CPU高温重启的解决办法

    Win11/10热跳闸错误怎么修复? 什么是热跳闸错误? 热跳闸(thermal trip)是一种CPU过热保护机制,当CPU温度超过指定上限时,系统会自动关闭以防止硬件损坏。如果您不断遇到热跳闸错误,可能需要采取措施修复您的计算机。 修复热跳闸错误的步骤: 步骤1:清洁内部装置 首先,您需要确认您的计算机内部没有积尘和污垢。如果风扇和其他散热装置被堵塞,将…

    other 2023年6月27日
    00
  • 使用jQuery或者原生js实现鼠标滚动加载页面新数据

    让我们来探讨一下使用jQuery或者原生js实现鼠标滚动加载页面新数据的攻略。 1. 原生JS实现 步骤一: 获取滚动事件 我们需要在页面滚动时获取滚动事件,这可以使用原生JS的onscroll事件来实现。函数loadMoreData() 用于执行滚动加载数据的逻辑。 window.onscroll = function (event) { if ((win…

    other 2023年6月25日
    00
  • premiere怎么渲染队列? pr批量渲染各个序列时间线的技巧

    在Adobe Premiere中,渲染队列可以帮助我们处理后期制作中的视频及音频文件,提高渲染的效率。下面是premiere怎么渲染队列的详细攻略及批量渲染各个序列时间线的技巧。 Premiere怎么渲染队列? 步骤一:将素材拖入时间轴/序列 首先,我们需要将需要渲染的视频或音频素材拖入到时间轴或序列中,如果你使用的是一个包含多个序列的项目,需要先打开需要渲…

    other 2023年6月27日
    00
合作推广
合作推广
分享本页
返回顶部