Java学习:通过Javap反编译工具探究 -》Java中变量的声明,构造代码块和构造函数的执行顺序?

本文探讨了Java中构造函数、变量声明与初始化的顺序,解释了编译器如何处理构造函数前的变量声明,以及构造代码块的执行时机。通过实例演示了不同顺序下变量的最终值。

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

先上程序:

public class Hello {
	public Hello(){
		i=2000;//构造函数
	}
	int i=1000;//变量的声明和赋值
	{
		i=3000;//构造代码块
	}
	public static void main(String[] args) {
		System.out.println(new Hello().i);
	}
}

输出结果:2000
从程序的表面变量 i 并未遵守先声明再使用的原则(编译未报错),其实不然。程序编译之后通过使用javap反编译工具可以看到具体程序经过编译之后的样子。
使用命令:javap - c -l -private Hello
在这里插入图片描述

从上可以看出:
(1)在即使构造函数使用的变量在变量的声明之前,但是程序编译时还是会把声明提到构造函数的前面。
(2)可以看到无论是变量的赋值时候构造代码块最终都是在构造函数中执行的。并且构造函数的执行顺利放在了最后面(程序中构造函数是写在最前面的)。

当我们把构造函数注释掉,颠倒了构造代码块和变量声明的顺序,代码如下:

public class Hello {
	/*
	public Hello(){
		i=2000;
	}
	*/
	{
		i=3000;
	}
	int i=1000;
	public static void main(String[] args) {
		System.out.println(new Hello().i);
	}
}

程序输出:1000,查看程序编译后的文件:
在这里插入图片描述

可以看出当我们把变量赋值和构造代码块的顺利颠倒后,在编译后的构造函数中顺利也是颠倒的,因此我们得到第三个点:
(3)编译后构造函数中的变量赋值和构造代码块中的顺序与初始程序中的顺序一致。(原先 的构造函数总是最后执行的)

综上。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值