Java静态代码块与静态方法的区别及使用场景详解

(一)java静态代码块和静态方法的区别

Java静态代码块与静态方法的区别及使用场景详解

一般来说,如果项目启动时必须执行某些代码,则需要使用静态代码块。这种代码是主动执行的;项目启动时需要初始化。在不创建对象的情况下,其他程序调用时,需要使用静态方法。这种代码是被动执行的。静态方法在类加载时就已加载,可以直接使用类名调用。

例如,main 方法必须是静态的。这是程序的入口点。

两者的区别在于:静态代码块是自动执行的;

静态方法仅在调用时执行。

静态方法

(1)在Java中,可以定义不需要创建对象的方法。该方法是静态方法。要达到这种效果,只需要在类中定义的方法前添加static关键字即可。例如:

公共静态 int 最大值(int n1,int n2)

使用类的静态方法时,请注意:

在静态方法中,a只能直接调用同一个类的其他静态成员(包括变量和方法),而不能直接访问该类的非静态成员。这是因为非静态方法和变量在使用前需要创建类的实例对象,而静态方法在使用前不需要创建任何对象。

b 静态方法不能以任何方式引用this和super关键字,因为静态方法在使用前不需要创建任何实例对象。调用静态方法时,根本不会生成this引用的对象。

(2)静态变量是属于整个类而不是某个对象的变量。请注意,任何方法体内的变量都不能声明为静态,例如:

乐趣()

static int i=0;//非法。

(3) 类可以使用不包含在任何方法体中的静态代码块。当类被加载时,静态代码块就会被执行,并且只执行一次。静态块通常用于初始化类属性。例如:

静止的

类加载步骤

在Java中,类加载器将一个类加载到Java虚拟机中,需要分三个步骤完成:加载、链接和初始化。链接可分为三个步骤:验证、准备和解析。除了解析之外,其他步骤都是严格按顺序完成的。各步骤的主要工作如下:

加载:查找并导入类或接口的二进制数据;

链接:执行以下验证、准备和解析步骤,其中解析步骤是可选的;

验证:检查导入的类或接口的二进制数据的正确性;

准备工作:为类的静态变量分配并初始化存储空间;

解析:将符号引用转换为直接引用;

初始化:激活类的静态变量的初始化Java代码和静态Java代码块。

初始化类中的属性是静态代码块的常见用途,但只能使用一次。

(2) 静态代码块的初始化顺序

类父类{

静态字符串名称=“你好”;

System.out.println("父块");

静止的 {

System.out.println("父静态块");

公共父级(){

System.out.println("父构造函数");

子类扩展父类{

静态字符串子名称 = "你好";

System.out.println("子块");

静止的 {

System.out.println("子静态块");

公共孩子(){

System.out.println("子构造函数");

公共类 StaticIniBlockOrderTest {

公共静态无效主(字符串[] args){

new Child();//语句(*)

问题:执行语句(*)时,打印结果的顺序是怎样的?为什么?

答:执行语句(*)时,打印结果的顺序是:

父静态块

子静态块

父块

父构造函数

子块

子构造函数

分析:执行new When Child()时,首先检查父类中是否存在静态代码块。如果有,则先执行父类中静态代码块中的内容。父类中的静态代码块中的内容执行完后,再去执行子类(自己的类)中的静态代码块,子类的静态代码块执行完后,最后再去看看是否父类有一个非静态代码块。如果有,则执行父类的非静态代码块。父类的非静态代码块执行完毕后,再执行父类的构造方法;父类的构造方法执行后,会检查子类是否有非静态代码块,如果有,则执行子类的非静态代码块。子类的非静态代码块执行完后,就会执行子类的构造方法。这是对象的初始化顺序。

总结:

对象的初始化顺序:首先执行父类的静态内容。执行完父类的静态内容后,再执行子类的静态内容。子类的静态内容执行完毕后,检查父类是否有非静态内容。静态代码块,如果有一个则执行父类的非静态代码块。执行完父类的非静态代码块后,执行父类的构造方法。父类的构造函数执行完毕后,会检查子类中是否存在非静态代码块。如果子类中有非静态代码块,则执行它。子类的非静态代码块执行完后,就会执行子类的构造函数。总之,先执行静态代码块的内容,然后执行父类的非静态代码块和构造方法,最后执行子类的非静态代码块和构造方法。

注意:对于子类的构造函数,无论构造函数是否带参数,默认情况下都会先查找父类的不带参数的构造函数。如果父类没有无参构造函数,子类必须使用supper键来调用父类的带参构造函数,否则编译不通过。

原文地址:

你可能想看:
« 上一篇
下一篇 »

相关推荐

java中什么是冒泡,冒泡算法

2026年09月06日

27阅读

java中冒号,java双冒号

2026年09月06日

26阅读

java中的->,java中的是什么意思

2026年09月06日

24阅读

java中的super用法,Java中super的说明

2026年09月06日

28阅读

java中反射的应用,java中反射的应用场景

2026年09月06日

26阅读

java中开关的定义,Java关键字有哪些

2026年09月06日

26阅读