Java:代码块

文章目录

  • 一、介绍代码块
    • [1.1 静态代码块](#1.1 静态代码块)
    • [1.2 构造代码块](#1.2 构造代码块)
    • [1.3 构造器(构造方法)](#1.3 构造器(构造方法))
  • 二、代码块的执行顺序
    • [2.1 无继承关系的执行顺序](#2.1 无继承关系的执行顺序)
    • [2.2 有继承关系的执行顺序](#2.2 有继承关系的执行顺序)
  • 三、总结
  • END

鸡汤:
● 一个人的代码,可以是 private的;但一个项目的成功,必须是 public的协作。
● 愿你的代码没有 BUG,愿你的程序永不下线。愿你的努力终将编译成功,运行出你想要的未来。加油,Java 人!

博客是一个将自己的知识输出的过程,如果只知道 copy 课件是起不到巩固知识的作用的,而这篇文章算是我第一次脱离课件的创作,只依靠了 AI 写的大纲,写的不好请见谅,我会一点点进步,与君共勉!!

一、介绍代码块

有没有想过一个问题,那就是当我们在实例化(new)一个对象的时候,我们究竟实例化了一些什么呢?他们又是按照什么顺序执行呢? 这里就要介绍我们今天的主角代码块了!!!

1.1 静态代码块

作用在类加载的时候执行,且只执行一次,用于初始化静态变量,如果第二次加载该类,将不会执行静态代码块。

语法:

java 复制代码
static {
	静态变量;
}

1.创建一个 demoClass 类

`
2.当我们实例化两个 demoClass 对象会出现什么情况呢?

3.结果:

我们发现静态代码块只执行了一次,也就是 静态代码块只在实例化 c1 (第一次调用类)时执行了一次,之后再次调用 demoClass 类时,就不会再执行静态代码块。

1.2 构造代码块

作用:在每次创建对象、调用构造器之前执行 用于提取所有构造器的公共初始化代码。

语法:

java 复制代码
{
	构造代码块;
}

1. 在 demoClass 类中写入一个构造代码块

2.当我们实例化两个 demoClass 对象会出现什么情况呢?


3.结果:

我们发现构造代码块执行了两次,也就是 构造代码块在实例化 c1、c2时都被执行了一次,所以构造代码块在每实例化(new)对象的时候都要执行一次。

1.3 构造器(构造方法)

作用:在创建一个类的新对象时,自动调用该方法,用于初始化这个新对象。

语法:

java 复制代码
Classname(类名) (参数) {
	初始化代码;
}

1. 在 demoClass 类中写入一个不含参数的构造方法

2.当我们实例化两个 demoClass 对象会出现什么情况呢?

构造方法执行了两次,也就是 构造方法在实例化 c1、c2时都被执行了一次,所以构造方法在每实例化(new)对象的时候都要执行一次。

注:构造方法每个类都有,就算你没有显式的写构造方法,编辑器也会隐式的提供一个无参的构造方法。

二、代码块的执行顺序

那我们在想,在 new 一个对象的时候,static { }、{ }、构造方法,谁先执行?如果存在继承关系呢?

2.1 无继承关系的执行顺序

1.我们写一个无继承关系,有静态代码块、构造代码块和构造方法的代码

java 复制代码
public class demoClass {
    int a = 10;
    String b = "hallo World";
    public demoClass() {
        //构造方法
        System.out.println("调用了构造方法...");
        System.out.println("结束构造方法...");
    }
    
    static {
        //静态代码块
        System.out.println("执行了静态代码块...");
        System.out.println("结束静态代码块...");
    }

    {
        //构造代码块
        System.out.println("执行了构造代码块...");
        System.out.println("结束构造代码块...");
    }
}

2.实例化一个 demoClass 对象 c1

java 复制代码
public class textClass {
    public static void main(String[] args) {
        demoClass c1 = new demoClass();
    }
}

3.结果


从结果可以看出无继承关系的执行顺序为:静态代码块 -> 构造代码块 -> 构造器(构造方法)

2.2 有继承关系的执行顺序

1.我们写一个 demo 继承于 demoClass 类,demo 有自己的静态代码块、构造代码块和构造方法
注:为方便观察将结束语句删除

java 复制代码
//父类代码
public class demoClass {
    int a = 10;
    String b = "hallo World";
    public demoClass() {
        //构造方法
        System.out.println("调用了父类构造方法...");
    }

    static {
        //静态代码块
        System.out.println("执行了父类静态代码块...");
    }

    {
        //构造代码块
        System.out.println("执行了父类构造代码块...");
    }
}
//子类代码
public class demo extends demoClass{
    public demo() {
        //构造方法
        System.out.println("调用了子类构造方法...");
    }

    static {
        //静态代码块
        System.out.println("执行了子类静态代码块...");
    }

    {
        //构造代码块
        System.out.println("执行了子类构造代码块...");
    }
}

2.实例化(new)一个 demo 对象,观察结果


3.结果


从结果可以看出有继承关系的执行顺序为:父类静态代码块 -> 子类静态代码块 -> 父类构造代码块 -> 父类构造器(父类构造方法) -> 子类构造代码块 -> 子类构造器(子类构造方法)

三、总结

做一个表格来总结一下这三种代码块:

特性 构造代码块 静态代码块 构造器(构造方法)
语法 { /* 代码 */ } static { /* 代码 */ } ClassName() { /* 代码 */ }
执行时机 每次创建对象时,在构造器​​之前​​执行 类​​首次加载​​时执行(JVM类加载阶段) 每次创建对象时执行
执行次数​ 每次new对象时执行一次 整个程序运行期间​​只执行一次 每次new对象时执行一次
主要作用 提取多个构造器的公共初始化逻辑 初始化静态变量 初始化对象状态
JVM实现​ 被编译器合并到每个< init >方法开头 生成独立的< clinit >方法,类加载时调用 对应类的方法

注意⚠️:
● 静态代码块中不要初始化非静态成员。
● 谨慎在静态代码块中抛出异常。
● 构造代码块可用于减少构造器中的重复代码。


END

第一次脱离课件写博客,撒花🎉
写的不好请见谅😙
写的第十五篇文章,感谢大家的观看!

相关推荐
写代码的【黑咖啡】2 小时前
Python 中的 Gensim 库详解
开发语言·python
TTBIGDATA3 小时前
【Hue】Ambari 页面启动 Hue 失败 user ‘hadoop‘ does not exist
java·hadoop·ambari
多米Domi0114 小时前
0x3f 第49天 面向实习的八股背诵第六天 过了一遍JVM的知识点,看了相关视频讲解JVM内存,垃圾清理,买了plus,稍微看了点确定一下方向
jvm·数据结构·python·算法·leetcode
饺子大魔王的男人4 小时前
Remote JVM Debug+cpolar 让 Java 远程调试超丝滑
java·开发语言·jvm
人工智能训练10 小时前
【极速部署】Ubuntu24.04+CUDA13.0 玩转 VLLM 0.15.0:预编译 Wheel 包 GPU 版安装全攻略
运维·前端·人工智能·python·ai编程·cuda·vllm
yaoming16810 小时前
python性能优化方案研究
python·性能优化
兩尛10 小时前
c++知识点2
开发语言·c++
fengfuyao98510 小时前
海浪PM谱及波形的Matlab仿真实现
开发语言·matlab
xiaoye-duck11 小时前
C++ string 底层原理深度解析 + 模拟实现(下)——面试 / 开发都适用
开发语言·c++·stl
码云数智-大飞11 小时前
使用 Python 高效提取 PDF 中的表格数据并导出为 TXT 或 Excel
python