专栏首页编程心路代码块相关的题,特么再也不会做错了!

代码块相关的题,特么再也不会做错了!

代码块包括静态代码块和非静态代码块,另外还有构造函数,它们的执行顺序是面试中经常考的,理解了下面这些基本知识,特么再也不会做错了。

一、静态代码块

定义

一个类的源文件(.java)被编译为字节码文件(.class)后,当需要使用某个类时,Java 虚拟机就将该类的字节码文件读入内存,加载类中的信息,静态代码块只被执行一次,且静态代码块不能被访问修饰符(private、default、protected、public)修饰。静态代码块是初始化该类的,而构造函数才是初始化该类具体的对象实例的。

// 静态代码块
static {
    ...
}

静态代码块执行的时机

1、显式使用 Class.forName() 加载某个类时。

2、执行一个类的 main() 方法时。

3、使用构造函数创建(new)一个对象时,如 Test test = new Test(),等同于 Test test = Class.forName().newInstance()。

4、调用类的静态变量(static)时,注意调用静态常量(final static 关键字修饰)是不会执行静态代码块的。

5、调用类的静态函数时,无论是否有 final 关键字修饰,都会执行静态代码块。

注意

1、多个静态代码块按定义的顺序从前往后依次执行。

2、使用 Class.forName() 时不初始化该类不会执行静态代码块,如 Class.forName("Test", false, Test.class.getClassLoader())。

静态代码块的作用

静态代码块具有初始化静态成员变量和给静态成员变量赋值的作用,如单例模式中的饿汉模式,类一旦加载就实例化出一个对象,用到的就是静态代码块。

二、非静态代码块

定义

非静态代码块又称为初始化块,直接用 {} 定义,可以用在类中和方法中。

// 非静态代码块
{
    ...
}

非静态代码块执行的时机

静态代码块执行之后,构造函数执行之前,每一次创建对象时执行。

注意:多个非静态代码块按定义的顺序从前往后依次执行。

非静态代码块的作用

非静态代码块也有初始化变量和对象的作用,但这个初始化有些鸡肋,因为我们都是在构造函数中初始化对象的。

三、总结

一个类中,按照如下顺序执行:

1、执行静态代码块

2、执行非静态代码块

3、执行构造函数

对于静态变量、静态代码块、变量、非静态代码块、构造函数,它们的初始化顺序依次是(静态变量、静态初始化块)>(变量、非静态代码块)> 构造函数。

在多个类的继承中,按照如下顺序执行:

1、执行父类的静态代码块,初始化父类静态变量。

2、执行子类的静态代码块,初始化子类静态变量。

3、执行父类的非静态代码块和父类的构造函数,初始化父类的成员变量。

3、执行子类的非静态代码块和字类的构造函数,初始化子类的成员变量。

初始化过程

本文参与腾讯云自媒体分享计划,欢迎正在阅读的你也加入,一起分享。

我来说两句

0 条评论
登录 后参与评论

相关文章

  • SSH框架之旅-struts2(3)

    OGNL,全称是 Object-Graph Navigation Language(对象导航语言),是一种功能强大的开源表达式语言,通过简单的表达式语法就可以存...

    Wizey
  • 为什么人人都需要学习Git?

    先来说说 Git 的由来,Git 是一个版本控制软件,最初是由 Linux 之父——林纳斯·托瓦兹 为了更好的管理 Linux 内核代码而编写的。当时 林纳斯 ...

    Wizey
  • Github学习文档-2

    你可能会问学习 GitHub 和 Git 有什么关系吗?首先 GitHub 的功能本身就是基于 Git 来实现。现在的问题是 Git 是什么?Git 是一个开源...

    Wizey
  • 代码健康: 减少嵌套, 降低复杂性

    原文: Code Health: Reduce Nesting, Reduce Complexity

    用户1558438
  • IBM的AI训练技术速度提高4倍,并保持原有精度

    计算效率是AI的核心问题。同时保持训练速度、准确性和能耗并不容易,但是最近硬件的进步使得这个目标比以前更容易实现。IBM将在本周展示AI训练方法,这些方法能带来...

    AiTechYun
  • LeetCode题目31:下一个排列

    实现获取下一个排列的函数,算法需要将给定数字序列重新排列成字典序中下一个更大的排列。

    二环宇少
  • Get不到AI的点?一定要看《程序员的AI书:从代码开始》!

    当老姑大伯们渐渐把AI和程序员画上等号时,我大腿一拍大事不妙!生怕疫情后的家庭聚会上,让我表演才艺:做个什么狗陪他们下棋、做个什么精灵跟他们唠嗑……

    博文视点Broadview
  • Android 8.1 开发者预览版 —— 为 ML 机器学习做好准备的 Oreo 升级版

    Android 开发者
  • 学术资讯|云+峰会干货全集

    优图实验室
  • 实现微服务架构最流行Style,Spring Boot+Spring Cloud

    我的学习是先从Spring boot开始的,然后接触到微服务架构,当然,这一切最大的启迪还是感谢我的一个老师,是他给我指明了新的道路,让我眼前一亮,再次感谢。

    架构师小秘圈

扫码关注云+社区

领取腾讯云代金券