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

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

相关推荐
咩咩啃树皮13 小时前
第40篇:Vue3组件化开发精讲——组件拆分、复用、父子通信、工程化架构
java·前端·架构
灯澜忆梦14 小时前
GO_并发编程---定时器
开发语言·后端·golang
鱟鲥鳚14 小时前
Spring Boot 集成 LangChain4j:从模型调用到 Tool Calling(Demo版)
java·spring boot
-银雾鸢尾-14 小时前
C#中的StringBuilder相关方法
开发语言·c#
富唯智能14 小时前
复合机器人 vs 工业人形机器人|工厂工序选型回本方案
经验分享
-银雾鸢尾-14 小时前
C#中结构体与类的区别;抽象类与接口的区别
开发语言·c#
世人万千丶15 小时前
参数管理_Flutter在鸿蒙平台路由参数最佳实践
学习·flutter·华为·harmonyos·鸿蒙
大模型码小白15 小时前
【Python零基础教程】继承、多态与魔法函数:面向对象编程三大核心特性详解
java·大数据·开发语言·人工智能·python·ai编程
麻雀飞吧16 小时前
最新量化学习路径,交易认知和技术实现要并行
人工智能·python
腾渊信息科技公司16 小时前
Spring Boot对接MES实战:视觉检测数据自动同步方案
java·人工智能·spring boot·后端·计算机视觉·ai·软件需求