Loading [MathJax]/jax/output/CommonHTML/config.js
前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >专栏 >Java中静态代码块、构造代码块、构造函数、普通代码块

Java中静态代码块、构造代码块、构造函数、普通代码块

作者头像
IT可乐
发布于 2022-05-09 06:08:17
发布于 2022-05-09 06:08:17
2K07
代码可运行
举报
文章被收录于专栏:IT可乐IT可乐
运行总次数:7
代码可运行

  在Java中,静态代码块、构造代码块、构造函数、普通代码块的执行顺序是一个笔试的考点,通过这篇文章希望大家能彻底了解它们之间的执行顺序。

1、静态代码块

  ①、格式

  在java类中(方法中不能存在静态代码块)使用static关键字和{}声明的代码块:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
public class CodeBlock {
	static{
		System.out.println("静态代码块");
	}
}
  ②、执行时机

  静态代码块在类被加载的时候就运行了,而且只运行一次,并且优先于各种代码块以及构造函数。如果一个类中有多个静态代码块,会按照书写顺序依次执行。后面在比较的时候会通过具体实例来证明。

  ③、静态代码块的作用

  一般情况下,如果有些代码需要在项目启动的时候就执行,这时候就需要静态代码块。比如一个项目启动需要加载的很多配置文件等资源,我们就可以都放入静态代码块中。

  ④、静态代码块不能存在任何方法体中

  这个应该很好理解,首先我们要明确静态代码块是在类加载的时候就要运行了。我们分情况讨论:

  对于普通方法,由于普通方法是通过加载类,然后new出实例化对象,通过对象才能运行这个方法,而静态代码块只需要加载类之后就能运行了。

  对于静态方法,在类加载的时候,静态方法也已经加载了,但是我们必须要通过类名或者对象名才能访问,也就是说相比于静态代码块,静态代码块是主动运行的,而静态方法是被动运行的。

  不管是哪种方法,我们需要明确静态代码块的存在在类加载的时候就自动运行了,而放在不管是普通方法还是静态方法中,都是不能自动运行的。

  ⑤、静态代码块不能访问普通变量

  这个理解思维同上,普通变量只能通过对象来调用,是不能放在静态代码块中的。

2、构造代码块

  ①、格式

  在java类中使用{}声明的代码块(和静态代码块的区别是少了static关键字):

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
public class CodeBlock {
	static{
		System.out.println("静态代码块");
	}
	{
		System.out.println("构造代码块");
	}
}
  ②、执行时机

  构造代码块在创建对象时被调用,每次创建对象都会调用一次,但是优先于构造函数执行。需要注意的是,听名字我们就知道,构造代码块不是优先于构造函数执行,而是依托于构造函数,也就是说,如果你不实例化对象,构造代码块是不会执行的。怎么理解呢?我们看看下面这段代码:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
public class CodeBlock {
	{
		System.out.println("构造代码块");
	}
	
	public CodeBlock(){
		System.out.println("无参构造函数");
	}
	public CodeBlock(String str){
		System.out.println("有参构造函数");
	}
}

  我们反编译生成的class文件:

  如果存在多个构造代码块,则执行顺序按照书写顺序依次执行。

  ③、构造代码块的作用

   和构造函数的作用类似,都能对对象进行初始化,并且只要创建一个对象,构造代码块都会执行一次。但是反过来,构造函数则不一定每个对象建立时都执行(多个构造函数情况下,建立对象时传入的参数不同则初始化使用对应的构造函数)。

  利用每次创建对象的时候都会提前调用一次构造代码块特性,我们可以做诸如统计创建对象的次数等功能。

3、构造函数 

  1.构造函数的命名必须和类名完全相同。在java中普通函数可以和构造函数同名,但是必须带有返回值;

  2.构造函数的功能主要用于在类的对象创建时定义初始化的状态。它没有返回值,也不能用void来修饰。这就保证了它不仅什么也不用自动返回,而且根本不能有任何选择。而其他方法都有返回值,即使是void返回值。尽管方法体本身不会自动返回什么,但仍然可以让它返回一些东西,而这些东西可能是不安全的;

  3.构造函数不能被直接调用,必须通过new运算符在创建对象时才会自动调用;而一般的方法是在程序执行到它的时候被调用的;

  4.当定义一个类的时候,通常情况下都会显示该类的构造函数,并在函数中指定初始化的工作也可省略,不过Java编译器会提供一个默认的构造函数.此默认构造函数是不带参数的。而一般的方法不存在这一特点;

4、普通代码块

  普通代码块和构造代码块的区别是,构造代码块是在类中定义的,而普通代码块是在方法体中定义的。且普通代码块的执行顺序和书写顺序一致。

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
public void sayHello(){
	{
		System.out.println("普通代码块");
	}
}

5、执行顺序

  • 静态代码块>构造代码块>构造函数>普通代码块
代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
public class CodeBlock {
	static{
		System.out.println("静态代码块");
	}
	{
		System.out.println("构造代码块");
	}
	public CodeBlock(){
		System.out.println("无参构造函数");
	}
	
	public void sayHello(){
		{
			System.out.println("普通代码块");
		}
	}
	
	public static void main(String[] args) {
		System.out.println("执行了main方法");
		
		new CodeBlock().sayHello();;
		System.out.println("---------------");
		new CodeBlock().sayHello();;
	}
}

  反编译生成的class文件:

执行结果:

  我们创建了两个匿名对象,但是静态代码块只是调用了一次。

6、父类和子类执行顺序

  对象的初始化顺序:

  首先执行父类静态的内容,父类静态的内容执行完毕后,接着去执行子类的静态的内容,当子类的静态内容执行完毕之后,再去看父类有没有构造代码块,如果有就执行父类的构造代码块,父类的构造代码块执行完毕,接着执行父类的构造方法;父类的构造方法执行完毕之后,它接着去看子类有没有构造代码块,如果有就执行子类的构造代码块。子类的构造代码块执行完毕再去执行子类的构造方法。

  总之一句话,静态代码块内容先执行,接着执行父类构造代码块和构造方法,然后执行子类构造代码块和构造方法。

  父类:SuperClass.java

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
package com.ys.extend;

public class SuperClass {
	static{
		System.out.println("父类静态代码块");
	}
	{
		System.out.println("父类构造代码块");
	}
	public SuperClass(){
		System.out.println("父类构造函数");
	}
}

  子类:SubClass.java

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
package com.ys.extend;

public class SubClass extends SuperClass{
	static{
		System.out.println("子类静态代码块");
	}
	
	{
		System.out.println("子类构造代码块");
	}
	
	public SubClass(){
		System.out.println("子类构造函数");
	}
	
}

  测试:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
public static void main(String[] args) {
	SubClass sb = new SubClass();
	System.out.println("------------");
	SubClass sb1 = new SubClass();
}

  打印结果:

本文参与 腾讯云自媒体同步曝光计划,分享自作者个人站点/博客。
原始发表:2018-01-05,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 作者个人站点/博客 前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体同步曝光计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
暂无评论
推荐阅读
编辑精选文章
换一批
Java中静态代码块、构造代码块、构造函数、普通代码块
版权声明:署名,允许他人基于本文进行创作,且必须基于与原先许可协议相同的许可协议分发本文 (Creative Commons)
Fisherman渔夫
2019/07/31
1.7K0
Java中静态代码块、构造代码块、构造函数、普通代码块
静态代码块、构造代码块以及构造函数的加载顺序
首先,静态代码块,构造代码块,和构造函数都存在于一个类中,只不过,他们执行的先后顺序和执行的次数不同。
week
2018/08/24
7600
Java中类的静态代码块、构造代码块、构造方法、普通代码块
Java中静态代码块、构造代码块、构造方法、普通代码块的执行顺序是一个比较常见的笔试题,合理利用其执行顺序也能方便实现项目中的某些功能需求 。
小诸葛
2020/04/14
3.7K0
Java中类的静态代码块、构造代码块、构造方法、普通代码块
普通代码块 静态代码块 构造代码块......傻傻分不清
在上面分类描述中,我们已经给出了答案;接下来我们跑一跑测试代码,根据代码执行结果来验证这些答案
麦洛
2021/04/29
1K0
普通代码块 静态代码块 构造代码块......傻傻分不清
【Java学习笔记之十七】Java中普通代码块,构造代码块,静态代码块区别及代码示例分析
//执行顺序:(优先级从高到低。)静态代码块>mian方法>构造代码块>构造方法。 其中静态代码块只执行一次。构造代码块在每次创建对象是都会执行。 1 普通代码块 1 //普通代码块:在方法或语句中出现的{}就称为普通代码块。普通代码块和一般的语句执行顺序由他们在代码中出现的次序决定--“先出现先执行” 2 public class CodeBlock01{ 3 public static void main(String[] args){ 4 5
Angel_Kitty
2018/04/09
9630
Java中静态代码块和构造代码块
    构造代码块在创建对象时被调用,每次创建对象都会被调用,并且构造代码块的执行次序优先于类构造函数。
緣來
2020/01/02
1.2K0
构造代码块、静态代码块、构造方法的执行顺序
https://www.cnblogs.com/ysocean/p/8194428.html
真率
2024/07/05
1810
关于java中普通代码块、构造代码块与静态代码块
public static void main(String[] args) { /*普通代码块: *直接定义在在方法或语句中出现”{普通代码的执行语句}“的就称为普通代码块。 *普通代码块执行顺序由他们在代码中出现的次序决定--“先出现先执行” * */ {   System.out.println("这里是普通代码块A"); } //new A(); {   System.out.println("这里是普通代码块B"); } }
指尖改变世界
2018/08/31
1.5K0
关于java中普通代码块、构造代码块与静态代码块
java构造方法,构造代码块,静态代码块的执行顺序
每周聚焦
2025/03/07
980
java构造方法,构造代码块,静态代码块的执行顺序
java从入门到精通四(面向对象上,类与对象的实现,代码块的执行顺序)
面向对象的方法主要是把事物对象化,包括属性和行为。而面向对象编程则比较贴近生活的实际,也就说,在程序中的编程,力图对描述的事物在现实中的形态保持一致。为了做到这一点,我们java中也就有类和对象的概念。类是对一类事物的抽象,类下就有若干对象,对象用于描述类中事物的个体。说来光看定义还是比较抽象,不容易理解。我们在下面的编程实践中可以大致理解这种思维模式。
兰舟千帆
2022/07/16
7990
java从入门到精通四(面向对象上,类与对象的实现,代码块的执行顺序)
静态代码块、静态变量,构造代码块、实例变量的执行顺序和继承逻辑
各位小伙伴大家好,我是A哥。如果问:Java的三大特性是什么?你顺口就能答出:封装、继承、多态。如果继续问:你真的了解Java中的继承吗?
YourBatman
2022/05/06
1K0
静态代码块、静态变量,构造代码块、实例变量的执行顺序和继承逻辑
【面试题】Java中子类和父类静态代码块、非静态代码块、构造函数的执行顺序总结一览表
在面试的时候,有时候我们会被问到这样的问题:子类A继承父类B,A a = new A();则父类B的构造函数、父类B静态代码块、父类B非静态代码块、子类A构造函数、子类A静态代码块、子类A非静态代码块执行的先后顺序是什么?
凯哥Java
2022/12/02
6920
【面试题】Java中子类和父类静态代码块、非静态代码块、构造函数的执行顺序总结一览表
Java代码块执行顺序初探
Java继承中对构造函数是不继承的,只是显式或者隐式调用,并且必须是在构造函数第一行。这里是隐式调用了super()。
WindCoder
2018/09/19
2.7K0
Java代码块
在 Java 中,使用{}括起来的代码被称为代码块,根据其位置和声明的不同,可以分为局部代码块,构造代码块,静态代码块,同步代码块(多线程)
闲花手札
2021/08/24
9030
Java中静态代码块、代码块以及构造函数执行顺序详解
前段时间面试,做到一个笔试题主要考察的是静态代码块,代码块,构造方法的执行顺序,由于自己没复习所以这个题肯定没做出来,回家后在Idea中进行代码测试运行。
大猫的Java笔记
2020/09/30
1.5K0
(转) Java 静态代码块和非静态代码块
Java中的静态代码块是在虚拟机加载类的时候,就执行的,而且只执行一次。如果static代码块有多个,JVM将按照它们在类中出现的先后顺序依次执行它们,每个代码块只会被执行一次。
Dar_Alpha
2018/09/03
1.2K0
【小家java】类中静态代码块、构造代码块、静态变量、成员变量执行顺序和继承逻辑
诚如各位所知,java的三大特性:封装、继承、多态。其中继承,是java中最有学问的一点也是最相对来说最难理解的一些东西,本文针对于此,做一些实例分析,希望能够帮助大家理解java中的继承机制
YourBatman
2019/09/03
1.5K0
【小家java】类中静态代码块、构造代码块、静态变量、成员变量执行顺序和继承逻辑
【Java基础-2】构造函数与构造代码块
构造函数是Java中的一个重要概念,它的作用是对对象的数据进行初始化。怎么去理解呢?以新生入学为例,我们当然可以在学生入学后去给他分配班级和学号,如果想让一个新生一旦入学就拥有班级和学号呢?请看下面示例代码:
云深i不知处
2020/09/16
4590
Java 静态代码块,构造代码块,构造函数执行顺序
特点:类的加载而执行,只执行一次,并优先于主函数。具体说,静态代码块是由类调用的。类调用时,先执行静态代码块,然后才执行主函数的,总的来说,静态代码块是和类一起的,优先级最高,类加载的同时,静态代码块同时也执行,但只执行一次,所以作用一般是用来加载一些配置代码,或者加载某些文件配置。
用户7353950
2022/05/10
8300
Java 静态代码块,构造代码块,构造函数执行顺序
静态代码块、非静态代码块、构造函数三者执行顺序
主要探讨一下关于静态代码块,非静态代码块,构造函数的执行顺序。 如有错误,欢迎指出。
HaC
2020/12/30
5190
推荐阅读
相关推荐
Java中静态代码块、构造代码块、构造函数、普通代码块
更多 >
领券
💥开发者 MCP广场重磅上线!
精选全网热门MCP server,让你的AI更好用 🚀
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档
本文部分代码块支持一键运行,欢迎体验
本文部分代码块支持一键运行,欢迎体验