java 代码块

本文深入探讨了Java类加载过程中的静态方法和静态代码块,包括类装载步骤、初始化过程及静态块与普通块的区别。通过示例代码展示了如何在类中使用静态代码块进行属性初始化,并说明了其执行顺序。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

静态的方法或者方法块在 类加载的时候就已经初始化了,在类加载的时候 静态绑定。


一个类可以使用不包含在任何方法体中的静态代码块,当类被载入时,静态代码块被执行,且只被执行一次,静态块常用来执行类属性的初始化。例如:
static
{
}


类装载步骤:
在Java中,类装载器把一个类装入Java虚拟机中,要经过三个步骤来完成:装载、链接和初始化,其中链接又可以分成校验、准备和解析三步,除了解析外,其它步骤是严格按照顺序完成的,各个步骤的主要工作如下:


装载:查找和导入类或接口的二进制数据;
链接:执行下面的校验、准备和解析步骤,其中解析步骤是可以选择的;
校验:检查导入类或接口的二进制数据的正确性;
准备:给类的静态变量分配并初始化存储空间;
解析:将符号引用转成直接引用;
初始化:激活类的静态变量的初始化Java代码和静态Java代码块。
初始化类中属性是静态代码块的常用用途,但只能使用一次。


普通块和静态块的异同:

相同点:都是在JVM加载类时且在构造方法执行之前执行,在类中都可以定义多个,一般在代码块中对一些static变量进行赋     值。

不同点:静态代码块在非静态代码块之前执行(静态代码块--》非静态代码块--》构造方法)。

    静态代码块只在第一次new执行一次,之后不在执行,而非静态代码块在每new一次就执行一次。非静态代码块可以     在普通方法中定义(个人感觉作用不大);而静态代码块不行。



示例:

父类方法:

package 方法块;

public class father {
	static{
		System.out.println("父类的静态方法块");
	}
	{
		System.out.println("父类的方法块");<pre name="code" class="java"><span style="white-space:pre">	</span>}
public father() {System.out.println("父类的构造函数");}}

子类方法:

package 方法块;

public class son extends father{
	static{
		System.out.println("子类的静态方法块");
	}
	{
		System.out.println("子类的方法块");
	}
	public son() {
		System.out.println("子类的构造函数");
	}
	public static void main(String[] args) {
		son s = new son();
	}
}
执行的顺序:

main中new 出子类实例时,由于子类继承了父类,会去先装载父类,由于静态方法块在装载的时候就会执行,所以判断父类中是否有静态的方法块,执行完毕后,再去子类中查找是否有静态的方法块,当子类的静态方法块执行完后,执行父类的普通方法块和父类的构造函数,执行结束后,再执行子类的普通方法块和子类的构造函数。


执行结果:

父类的静态方法块
子类的静态方法块
父类的方法块
父类的构造函数
子类的方法块
子类的构造函数

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值