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

知识共享许可协议 版权声明:署名,允许他人基于本文进行创作,且必须基于与原先许可协议相同的许可协议分发本文 (Creative Commons

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

源代码:

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;存在的

进一步结论:

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

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

猜你喜欢

转载自blog.csdn.net/qq_30552441/article/details/80023956
今日推荐