在java中,被final关键字修饰的变量,且设置了初始值,那么这个值在编译阶段就已经确定了值,则这个变量就是“宏变量”,编译器会把用到该变量的地方全部都替换成设置好的那个值。简单点说就是“被final关键字修饰且给了初始值的变量就是宏变量”。
下面看一个例子:
@Test public void test2() { String s1="java"; String s2="ja"+"va"; System.out.println(s1==s2); String str1="ja"; String str2="va"; String s3=str1+str2; System.out.println(s1==s3); }
输出结果:
true
false
dubug截图:
可以看到s1和s3确实不等。简单分析一下:
s1=“java”,“java”是字符串常量,我们知道是放在常量池中。s2="ja"+"va",会先去常量池中找是否存在“java”这个字符串,如果存在会把s2指向“java”的地址,所以s1和s2指向同一个地址,也就相等了。而s3=str1+str2是两个普通变量运算,编译器不执行宏替换,所以不相等。
下面用final修饰str1和str2
@Test public void test2() { String s1="java"; String s2="ja"+"va"; System.out.println(s1==s2); final String str1="ja"; final String str2="va"; String s3=str1+str2; System.out.println(s1==s3); }
输出结果:
true
true
我们可以看到s1和s2相等,被final修饰后,str1就会被替换为“ja”,str2会被替换为“va”,所以s3=str1+str2等价于s3="ja"+"va",所以s1和s3相等。