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

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

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

  在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 删除。

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

评论
登录后参与评论
暂无评论
推荐阅读
编辑精选文章
换一批
【操作系统】操作系统运行环境——处理器的运行模式
在上一篇内容中我们介绍了操作系统的发展史,操作系统从诞生到发展主要经历了手工操作阶段、批处理阶段、分时操作系统阶段、实时操作系统阶段、网络操作系统和分布式计算机系统阶段以及个人计算机操作系统这6个阶段。我们可以将其归纳为以下4个阶段:
蒙奇D索隆
2024/09/07
3510
【操作系统】操作系统运行环境——处理器的运行模式
​五分钟扫盲:进程与线程基础必知
进程(Process)和线程(Thread)是操作系统的基本概念,但是它们比较抽象,不容易掌握。以下这个解释出自阮一峰老师的博客(http://www.ruanyifeng.com/blog/2013/04/processes_and_threads.html),虽然「不是非常严谨,但是足够形象」,看完之后能对进程和线程有个非常直观的印象,这样也方便理解后文。
飞天小牛肉
2021/02/26
3930
​五分钟扫盲:进程与线程基础必知
操作系统习题知识点
操作系统有硬件和软件组成,硬件是CPUC软件建立与活动的基础,而软件是对硬件功能的扩充。硬件包括CPU、内存、I/O设备和总线等,软件通常分为应用软件、支撑软件和系统软件。
kif
2023/02/27
1.9K0
操作系统习题知识点
操作系统学习笔记-进程描述和控制
进程控制块包含了充分的信息,这样就可以中断一个进程的执行,并且在后来恢复执行进程时就好像进程未被中断过。进程控制块是操作系统能够支持多进程和提供多处理的关键工具。当进程被中断时,操作系统会把程序计数器和处理器寄存器(上下文数据)保存到进程控制块中的相应位置,进程状态也被改变为其他的值(例如阻塞状态或就绪状态)。
花猪
2022/02/16
8230
操作系统学习笔记-进程描述和控制
[每天五分钟,备战架构师-2]操作系统基本原理
操作系统是管理和控制计算机硬件和软件资源的计算机程序,是直接运行在“裸机”上的最基本的系统软件。注意,这里说的裸机可以是物理机,也可以是虚拟机。随着技术的发展,现在还出现了Docker容器技术,一个Docker容器实际上不一定需要具备完整的系统功能也能够运行程序,其底层是通过宿主机的内核来与硬件进行交互的。
大江小浪
2018/09/19
5300
[每天五分钟,备战架构师-2]操作系统基本原理
开发成长之路(21)-- 不可不知的操作系统知识(1)
最下面是硬件系统;最上面是使用计算机的人,即各种各样的用户;人与硬件系统之间是软件系统。系统软件是最靠近硬件的一层,其次是支撑软件和应用软件。
看、未来
2021/09/18
4730
操作系统 - 进程
系统为每一个运行的程序配置一个数据结构,称为进程控制块(PCB),用来描述进程的各种信息(如程序代码存放位置)
ppxai
2020/09/23
9230
操作系统 - 进程
《Linux操作系统编程》第二章 进程运行与调度: 了解进程的定义与特征、进程的状态与切换、进程管理的数据结构、进程的创建与终止、阻塞与唤醒、挂起与激活以及处理机调度的相关概念
要求学生了解进程的定义与特征、进程的状态与切换、进程管理的数据结构、进程的创建与终止、阻塞与唤醒、挂起与激活以及处理机调度的相关概念。
猫头虎
2024/04/08
4250
《Linux操作系统编程》第二章 进程运行与调度: 了解进程的定义与特征、进程的状态与切换、进程管理的数据结构、进程的创建与终止、阻塞与唤醒、挂起与激活以及处理机调度的相关概念
操作系统知识清单
1、存储器在CPU外,一般指硬盘,U盘等可以在切断电源后保存资料的设备,容量一般比较大,缺点是读写速度都很慢,普通的机械硬盘读写速度一般是50MB/S左右。
zhangjiqun
2024/12/16
680
操作系统知识梳理共9次缺页
第一章:概述 什么是操作系统? 是一段一直运行在计算机上的程序 是资源的分配者 向上管理软件向下管理硬件 为用户提供良好接口 中断的概念? 中断指当出现需要时,CPU暂时停止当前程序的执行转而执行处理新情况的程序和执行过程。 中断向量的概念? 各种设备的中断处理子程序的地址数组 什么是系统调用? 由操作系统实现提供的所有系统调用所构成的集合即(Application Programming Interface,API)。是应用程序同系统之间的接口。 内存是什么? 内存是处理器可以直接访问的唯一的大容量存储区
张俊怡
2018/04/24
8980
操作系统笔记-进/线程模型
进程表(process table),也称进程控制块(PCB),是由操作系统维护的,每个进程占用其中一个表项。该表项包含了操作系统对进程进行描述和控制的全部信息,从而保证该进程换出后再次启动时,就像从未中断过一样。
Cloud-Cloudys
2020/07/25
5570
关于操作系统的一些事,这些你应该要知道~
操作系统的运行机制 计算机系统中,通常CPU执行两种不同性质的程序:一种是操作系统内核程序;另一种是用户自编程序或系统外层的应用程序。对操作系统而言,这两种程序的作用不同,前者是后者的管理者,因此“管理程序”要执行一些特权指令,而“被管理程序”出于安全考虑不能执行这些指令。所谓特权指令,是指计算机中不允许用户直接使用的指令,如I/O指令、 置中断指令,存取用于内存保护的寄存器、送程序状态字到程序状态字寄存器等指令。操作系统在具体实现上划分了用户态(目态)和核心态(管态),以严格区分两类程序。 现代计算机几
谭庆波
2018/08/10
4350
关于操作系统的一些事,这些你应该要知道~
操作系统知识点整理
书《计算机操作系统》第四版(汤小丹编著) 课程操作系统 操作系统启动流程略了 md和pdf下载:Chasssser 完整版包括收集的题目 以下仅为知识点
Enterprise_
2019/02/20
1.2K0
你该懂得操作系统知识—内核态和用户态
现代操作系统一般将 OS 划分非若干层次,再将 OS 的不同功能分别设置在不同的层次中。通常将一些与硬件紧密相关的模块(如中断处理程序等)、各种常用设备的驱动程序以及运行频率较高的模块(如时钟管理、进程调度和许多模块所公用的一些基本操作),都安排在紧靠硬件的软件层次中,将它们常驻内存,即通常所称为的OS 内核。这种安排方式的目的在于两个方面:
早安嵩骏
2020/08/11
1.8K0
操作系统笔记-进程
由于某些硬件或操作是需要操作系统进行调用的,保证安全所以防止用户直接进行操作,而当用户要操作的只有操作系统能够调用的操作的时候,此时需要通知操作系统,而此时则是产生中断,中断实际上就是设置中断寄存器的标识位,cpu会在每个指令后检查其中断寄存器是否发生中断,如果发生则需要执行对应的中断程序。
大猫的Java笔记
2023/03/08
5970
操作系统笔记-进程
操作系统笔记【进程管理及控制
顺序执行:单道批处理的执行方式,也用于简单的单片机系统,具有独立功能的程序独占cpu直到得到最终结果的过程
BWH_Steven
2020/05/09
9570
操作系统之进程管理(上),研究再多高并发,都不如啃一下操作系统进程!!!
由图可知程序会先由编译器编译成机器指令,运行之前先把程序放入内存,在内存中创建一个进程实体。一个进程实体(进程映像)由PCB、程序段、数据段组成。然后CPU从内存中取出指令,来运行程序。
阿甘的码路
2022/09/22
4890
操作系统之进程管理(上),研究再多高并发,都不如啃一下操作系统进程!!!
大学课程 | 计算机操作系统
(3) 模块接口法的优缺点: 优点: ①提高OS设计的正确性,可理解性,可维护性 ②增强OS的可适应性 ③加速OS的开发过程 缺点: ①接口很难满足实际需求 ②无序模块法,无法寻找一个可靠的决定顺序
Justlovesmile
2021/12/14
9340
大学课程 | 计算机操作系统
《计算机操作系统-第三章》之中断与系统调用
早期的计算机虽然对程序的处理是成批进行的,但是内存中始终只能处理一个程序,而CPU的处理速度是非常的快的,当CPU运行期间向IO设备发送输入或者输出请求时,高度运转的CPU需要等待龟速的IO完成状态。为了提高资源利用率,人们就发明了操作系统,引入了中断机制,实现了多道程序技术。
用户10517932
2023/10/07
4700
《计算机操作系统-第三章》之中断与系统调用
『操作系统』 进程的描述与控制 Part 1 前驱图与程序执行
一个程序由若干个程序段组成,而这些程序段的执行必须是顺序的,这种程序执行的方式就称为程序的顺序执行。
风骨散人Chiam
2021/09/06
1.3K0
推荐阅读
相关推荐
【操作系统】操作系统运行环境——处理器的运行模式
更多 >
LV.1
百信银行资深运维工程师
作者相关精选
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档
本文部分代码块支持一键运行,欢迎体验
本文部分代码块支持一键运行,欢迎体验