package com.use;
import org.junit.Test;
/**
* @author sanny
*
* 宏替换(Macro Replace):发生在用 final 修饰的变量,定义该变量的时候就指定了初始值,
* 初始值在编译的时候就能确定了下来。
* 等于三个条件:
* 1:用 final 修饰。
* 2:在定义的时候指定初始值。
* 3:并且初始值在编译的时候就能确定。
*/
public class MacroReplace {
@Test
public void testName() throws Exception {
//下面两个局部变量由于在编译的时候就能确定,并且会被放在 constant pool 中
//管理,所以 name 和 name2 是同一个对象。并且在使用的时候会使用宏替换。在
//使用的地方,编译的时候 name 和 name2 直接会被替换为直接量:"sanny wang"。
String sanny="sanny";
String wang="wang";
final String name="sanny wang";
final String name2="sanny "+"wang";
//由于这里的 wang 是普通变量,所以编译器在编译的时候不能确定其值,所以 name
//和上面的不是同一个对象。而如果 wang 被 final 修饰的话,就是同一个对象了。
//因为 wang 会被宏替换。
final String name3="sanny "+wang;
System.out.println(name==name2);
System.out.println(name==name3);
}
}