Java程序初始化的顺序是怎样的?

Java语言中,当实例化一个对象时,首先需要对对象中的所有成员变量进行初始化,这些成员变量可能包括静态变量和非静态变量,只有当类中所有的成员变量都初始化完后,才会调用类的构造函数创建具体的对象。

一个Java类中,可能既有静态变量,也有非静态变量,同时可能存在静态代码块,以及非静态代码块,比如下面的 Test.java 类:

public class Test {

    private static final int DEFAULT_SIZE = 1;
    private String name;

    static {
        System.out.println("Hello World!");
    }

    {
        System.out.println("Today is Friday!");
    }

    public Test() {
    }
}

对于Java程序,初始化一般遵循以下几个原则(优先级依次递减):

(1) 静态对象(变量)优先于非静态对象(变量)初始化,其中,静态对象(变量)只初始化一次,而非静态对象(变量)可能会初始化多次

(2) 静态代码块优先于非静态代码块初始化

(3) 父类优先于子类进行初始化

(4) 按照成员变量的定义顺序进行初始化,即使变量定义散布于方法定义之中,它们依然在任何方法(包括构造函数)被调用之前先初始化

Java程序初始化工作,可以在许多不同的代码块中来完成,例如静态代码块、构造函数等,它们执行的顺序如下:

父类静态变量 –》父类静态代码块 –》子类静态变量 –》子类静态代码块 –》父类非静态变量 –》父类非静态代码块 –》父类构造函数 –》子类非静态变量 –》子类非静态代码块 –》子类构造函数

下面给出一个不同模块初始化时执行顺序的一个例子,首先定义一个父类 Parent.java

public class Parent {
    static {
        System.out.println("Parent static block");
    }

    {
        System.out.println("Parent block");
    }

    public Parent() {
        System.out.println("Parent constructor block");
    }
}

再定义一个子类 Child.java,它继承于 Parent.java,如下:

public class Child extends Parent {

    static {
        System.out.println("Child static block");
    }

    {
        System.out.println("Child block");
    }

    public Child() {
        System.out.println("Child constructor block");
    }

}

下面创建一个 Child 对象进行测试验证,看看初始化顺序到底是怎样的?

public static void main(String[] args) {
    Child child = new Child();
}

运行后,输出结果如下:

Parent static block
Child static block
Parent block
Parent constructor block
Child block
Child constructor block

Java程序初始化的顺序是怎样的?

更多有关Java面试相关的知识点可以关注【Java面试手册】小程序,涉及Java基础、多线程、JVM、Spring、Spring Boot、Spring Cloud、Mybatis、Redis、数据库、数据结构与算法等。

Java程序初始化的顺序是怎样的?

Original: https://www.cnblogs.com/javatop/p/16550523.html
Author: 然笑后端
Title: Java程序初始化的顺序是怎样的?

原创文章受到原创版权保护。转载请注明出处:https://www.johngo689.com/586424/

转载文章受原作者版权保护。转载请注明原作者出处!

(0)

大家都在看

  • 【hexo博客搭建】将搭建好的hexo博客部署到阿里云服务器上面(下)

    一.部署到阿里云服务器 既然博客也已经成功在本地部署,然后主题也成功安装,接下来就可以部署到服务器上面了,如果你也想要魔改matery主题,可以去各种博客上面找一找大佬的教程,或者…

    Java 2023年6月13日
    076
  • npm安装教程

    一、使用之前,我们先来掌握3个东西是用来干什么的。 npm: Nodejs下的包管理器。 webpack: 它主要的用途是通过CommonJS的语法把所有浏览器端需要发布的静态资源…

    Java 2023年6月5日
    091
  • Python实现改进后的Bi-RRT算法实例

    Python实现改进后的Bi-RRT算法实例 1.背景说明 以下代码是参照 上海交通大学海洋工程国家重点实验室《基于改进双向RRT的无人艇局部路径规划算法研究》的算法思想实现的。 …

    Java 2023年6月8日
    096
  • Dart 初探 (一)

    前言 Dart 是 Google 为 Flutter 开发的一款用于 网页编程的语言,其类似于 Javascript,也是一种面向对象的语言,但其采用 基于类的编程,语法风格接近C…

    Java 2023年6月7日
    097
  • Java HotSpot(TM) 64-Bit Server VM warning: INFO: os::commit_memory(0x0000000081c00000, 134217728, 0) failed; error

    Java HotSpot(TM) 64-Bit Server VM warning: INFO: os::commit_memory 编译程序时代码没错,结果报错,原因是内存满了,…

    Java 2023年6月6日
    084
  • vue将字符串中的数字替换为*

    再一次开发中碰到一个问题,为了防止交易双方在备注中互留电话导致诈骗的发生,做了一个自动将备注中的数字替换为*的需求 话不多说,上代码 let output = []; let te…

    Java 2023年6月14日
    073
  • Redis基本数据结构ZipList

    为什么要有ziplist 有两点原因: 普通的双向链表,会有两个指针,在存储数据很小的情况下,我们存储的实际数据的大小可能还没有指针占用的内存大,是不是有点得不偿失?而且Redis…

    Java 2023年6月7日
    095
  • 去除滚动条

    css;gutter:true;::-webkit-scrollbar { width: 0; height: 0; color: transparent;} Original: …

    Java 2023年5月29日
    087
  • Spring类ResolvableType、BeanWrapper使用

    在阅读Spring、SpringMVC 源码的时候经常看到这几个类,简单总结下这几个工具类的核心使用方法。 1. ResolvableType 直译过来就是可解析类型。 实际是对j…

    Java 2023年5月30日
    084
  • Spring Framework系统架构&学习路线

    核心容器-核心概念 posted @2022-07-05 21:30 yub4by 阅读(14 ) 评论() 编辑 Original: https://www.cnblogs.co…

    Java 2023年6月5日
    080
  • 位运算

    前置知识:二进制在内存中存在的形式是补码正数的反码和补码都是其本身负数的反码是在其原来的基础上,符号位不变,其他位取反。负数的补码是先变为反码,然后在反码的基础上+1 取反操作首先…

    Java 2023年6月6日
    084
  • nginx重定向规则入门

    Nginx的重定向用到了Nginx的HttpRewriteModule。 使用: rewrite命令 nginx的rewrite相当于apache的rewriterule(大多数情…

    Java 2023年5月30日
    0104
  • 什么是线上优雅停机和调整线程池参数?

    我是3y,一年 CRUD经验用十年的 markdown程序员👨🏻‍💻常年被誉为职业八股文选手 好几天没更新 austin的系列文章啦,主要是一直在写 austin的代码。而这篇文章…

    Java 2023年6月9日
    0103
  • Oracle 报错 ORA-01843: not a valid month

    在导入SQL文件是出现,表导入正确,但是数据没有成功导入。 1,先找问题所在: 复制一个insert的语句在Navicat进行测试,出现报错。 ORA-01843: not a v…

    Java 2023年6月5日
    090
  • 使用Spring提供的BeanUtils.copyProperties()方法报错:Could not copy property ‘xxx’ from source to target

    出现问题:在使用BeanUtils.copyProperties()方法时,如果javaBean中的属性含有基本类型,而model模型中对应的属性值为 null 的话,就会出现这个…

    Java 2023年5月30日
    068
  • Java的值传递

    特别注意:java只有值传递没有引用传递。 一、值传递和引用传递的定义 值传递(pass by value)是指在调用函数时将实际参数复制一份传递到函数中,这样在函数中如果对参数进…

    Java 2023年5月29日
    0102
亲爱的 Coder【最近整理,可免费获取】👉 最新必读书单  | 👏 面试题下载  | 🌎 免费的AI知识星球