反编译.class和原java文件的源码对比

本文对比了字面量、变量及运算在编译前后的区别,指出字面量常量(非字符型)运算在编译期可直接得出结果,字符型常量相加则会拼接。字面量与变量(非字符型)相加不处理,字符串变量相加会用StringBuilder。单独的未使用变量在编译后仍存在。理解这些有助于深入理解Java编译过程。

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

主要是对比字面型常量之间、变量之间以及两者之间运算在编译后的差异

源代码:

int a=1+2;
System.out.println(a);
int b=10;
int c=20;
int d=a+b;
System.out.println(d);

.class文件反编译

int a = 3;
System.out.println(a);
int b=10;
int c=20;
int d=a+b;
System.out.println(d);

源代码:

String str1 = "abcd"; // 直接赋值
String str2 = new String("1234"); // 使用标准的new调用构造方法
String str6="ab"+"cd";
String str7="ab";
String str8="cd";
String str9=str7+str8;

.class文件反编译

String str1 = "abcd";
String str2 = new String("1234");
String str6 = "abcd";
String str7 = "ab";
String str8 = "cd";
String str9 = (new StringBuilder(String.valueOf(str7))).append(str8).toString();


源代码:

public class Test02 {
	public static final String A = "ab";
	public static final String B = "cd";

	public static final String C;
	public static final String D;
	static {
		C = "ab";
		D = "cd";
	}

	public static void main(String[] args) {
		String ssss = A + B;
		System.out.println(ssss == t);// true
		System.out.println((C + D) == t);// false
	}

.class文件反编译:

public class Test02
{

	public static final String A = "ab";
	public static final String B = "cd";
	public static final String C = "ab";
	public static final String D = "cd";

	public Test02()
	{
	}

	public static void main(String args[]){
		String ssss = "abcd";
		System.out.println(ssss == t);
		System.out.println((new StringBuilder(String.valueOf(C))).append(D).toString() == t);
	}

源代码:

String s2 = "cd";
String ss = "ab" + s2;

.class文件反编译:

String s2 = "cd";
String ss = (new StringBuilder("ab")).append(s2).toString();

总结:

  • 两个字面型常量(非字符型)相加减乘除,编译期会运算出结果
  • 两个字符型常量相加,编译期就会进行拼接得出结果
  • 一个字面型常量(非字符型)和一个变量(非字符型)相加减乘除,编译期是不做处理的
  • 两个字符串类型的变量相加,或者一个字面型常量(字符串类型)和一个变量(字符串类型)相加编译期会进行StringBuilder的包装处理,但是不会得出结果

注意: 单独的int a=10;但是a后面并没有使用,编译后还是会有int a=10;存在的

进一步结论:

  • 只有当两个字面型常量直接运算时,会在编译期得出结果

不懂或者总结不全的地方,就自己敲代码实践一下吧!

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值