在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相等。 |