Java之初始化顺序实践

这篇具有很好参考价值的文章主要介绍了Java之初始化顺序实践。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

功能概述

  • 在创建Java对象时,需要将对象中的成员变量进行初始化后,才能调用对象的构造方法创建对象。本文中将会讲解初始化时父类与子类对应的顺序。

功能实践

场景1:父类、子类的初始化顺序

用例代码
@Test
public void test_init_order() {
    new Child();
}

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

    {
        System.out.println("父类非静态块");
    }

    public Parent() {
        System.out.println("父类构造方法");
    }
}

public class Child extends Parent {

    static {
        System.out.println("子类静态块");
    }

    {
        System.out.println("子类非静态块");
    }

    public Child() {
        System.out.println("子类构造方法");
    }
}
结果输出
父类静态块
子类静态块
父类非静态块
父类构造方法
子类非静态块
子类构造方法
结果分析
  • 先初始化静态块:父类的静态块 -> 子类的静态块。
  • 再初始化非静态块以及构造方法:
    • 父类的非静态块 -> 父类的构造方法
    • 子类的非静态块 -> 子类的构造方法

场景2:块、成员域中初始化顺序

用例代码
static {a = 2;} //静态块中初始化
static int a = 1; //成员域中初始化
static int b = 3;

static {b = 4;}

{c = 5;} //可以放在声明的上面
int c = 3;

@Test
public void test_order() {
    System.out.println(a);
    System.out.println(b);
    System.out.println(c);
}
结果输出
1
4
3
结果分析
  • 块中的初始化与成员域中的初始化是平级的,所以会按照从上到下初始化,最后一次初始化为最终的值。

场景3:静态变量的调用

用例代码
@Test
public void test_static_var() {
    System.out.println(InitB.c);
}

public class InitA {
    public static String c = "C";
    static {
        System.out.println("A");
    }
}

public class InitB extends InitA {
    static {
        System.out.println("B");
    }
}

用例输出
A
C
结果分析
  • 因为调用InitB.c,static变量c在A类中,所以会加载父类A,所以输出了静态块中的"A"。
  • 因为InitB.c直接访问InitA的变量,不需要访问InitB中的其它内容,所以就不要加载InitB了。

功能总结

  • 初始化时,执行的顺序为:父类静态变量 -> 父类静态代码块 -> 子类静态变量 -> 子类静态代码块 -> 父类非静态变量 -> 父类非静态代码块 -> 父类构造方法 -> 子类非静态变量 -> 子类的非静态代码块 -> 子类构造方法。

文章来源地址https://www.toymoban.com/news/detail-682324.html

到了这里,关于Java之初始化顺序实践的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • java中初始化数组的方法

    方式一: 注:此种方式创建的数组,如不显式初始化数组元素,则各元素为当前数据类型的默认值。基本数据类型为0,对象类型为null。所以使用前需要将各元素显式赋值。 方式二: 注:此方式与方式一的结果相同,但是更简便。 方式三: 注:此方式与方式一和方式二的结

    2024年02月12日
    浏览(33)
  • Java集合类型对象的快速初始化

    在Java中, 集合类型的对象初始化, 一般是先创建对象, 然后往集合里面增加元素,这种写法直观,但是撰写代码的时候感觉比较冗余, 是否有什么酷炫的方式简化定义初始化呢? 本篇介绍字符串数组、List 和 Map类型对象的定义初始化简单方式。 常用的写法: 简化的写法

    2024年02月06日
    浏览(30)
  • Java HashMap初始化大小设置多少合适

    修改公司老代码的时候,发现阿里编码规约插件提示HashMap初始化时尽量指定初始值大小,因为设置合理的初始值可以提升性能:   HashMap继承自AbstractMap类,实现了Map、Cloneable、java.io.Serializable接口 , 是基于散列表实现的双列集合,它存储的是key-value键值对映射,每个key-va

    2024年02月09日
    浏览(40)
  • 【Java】构造方法及类的初始化

    活动地址:CSDN21天学习挑战赛 ✨ 博客主页: XIN-XIANG荣 ✨ 系列专栏: 【Java SE】 ✨ 一句短话: 难在坚持,贵在坚持,成在坚持! 构造方法(也称为构造器)是一个特殊的成员方法,其名字必须与类名相同,在创建对象时,由编译器自动调用,并且在整个对象的生命周期内只调用一次。

    2023年04月10日
    浏览(33)
  • Java中Map集合初始化并赋值

    Java中Map集合初始化并赋值的几种方式:

    2024年02月11日
    浏览(40)
  • 数据结构与算法——顺序表(顺序存储结构)及初始化详解

    顺序表 ,全名 顺序存储结构 ,是线性表的一种。通过《什么是线性表》一节的学习我们知道,线性表用于存储逻辑关系为“一对一”的数据,顺序表自然也不例外。 不仅如此,顺序表对数据的物理存储结构也有要求。 顺序表存储数据时,会提前申请一整块足够大小的物理

    2024年02月16日
    浏览(31)
  • Java开源项目mall学习笔记(1)——项目初始化

            该笔记是记录学习开源项目mall过程的文档笔记,完全原创,转载请声明。同时也对开源项目的作者表示感谢! mall: 🔥 mall项目是一套基于 SpringBoot + Vue + uni-app 实现的电商系统,包括前台商城项目及后台管理系统,采用Docker容器化部署。前台商城系统包含首页门户

    2024年02月12日
    浏览(34)
  • Java 中 Map 初始化的几种方法

    方式1:传统方式 方式2:java8新特性-双括号初始化 匿名内部类通常会导致内存泄漏问题,因为它会隐式地持有外部类的引用,如果外部类的引用一直存在而没有释放,它所持有的内存也就不会被垃圾回收机制回收,产生内存泄漏。而通过使用静态内部类或者弱引用等技术可以

    2024年02月05日
    浏览(41)
  • Spring初始化顺序- RabbitMq 无法自动创建队列

    项目中使用了RabbitMq, 并配置了自动创建topic, exchange,binding 等,但是通过测试发现,有一个队列始终无法自动创建,在对spring 源码以及rabbitmq 源码debug 后发现问题。 rabbitmq 配置了两套环境 , 以下为代码示例 Queue, Exchange, Binding 自动生成配置: 通过运行项目,发现队列,交换机

    2024年02月13日
    浏览(34)
  • 顺序表创建,初始化,赋值,取值,查找,插入与删除(附小例题)

    由n(n≥0)个数据结构相同的元素构成的有限序列。 1)除了第一个元素外,结构中的每一个数据元素均只有一个前驱 2)除了最后一个元素外,结构中的每一个数据元素均只有一个后驱 用一组地址 连续的存储单元依次 存储线性表的数据元素。 优点 : 随机存储 缺点 :在做插

    2024年02月07日
    浏览(32)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包