今天学到final关键字的时候,看到了用final实现的宏替代,想自己在这里总结一下学习心得,主要用来以后自己复习巩固,第一次写博客,有错误欢迎指正。
首先今天是因为看到下面这一段代码对final关键字产生了疑惑
public class FinalTest {
public static void main(String[] args) {
// TODO 自动生成的方法存根
String str1="Word";
final String str2="Word";
final String finalstr1="Hello"+str1;
final String finalstr2="Hello"+str2;
final String finalstr3="HelloWord";
System.out.println(finalstr3==finalstr1); //false
System.out.println(finalstr3==finalstr2); //true
}
}
后来才知道原来是final修饰符不仅可以定义终端变量,还可以实现"宏替代"。而定义宏变量的三个条件分别是
1)使用final修饰符修饰
2)在定义该变量时就初始化
3)保证该初始值在编译时就被确定下来
看到第三个条件时我就在想到底哪些值才能在编译时就能确定的呢?后来才知道原来这些值就是编译期常量,然后通过以下代码进行测试了一遍。
public class Test{
public static void main(String args[]){
// System.out.println(Data.i1);
System.out.println(Data.i2);//静态初始化
// System.out.println(Data.b1);//静态初始化
// System.out.println(Data.b2);
// System.out.println(Data.s1);
// System.out.println(Data.s2);//静态初始化
// System.out.println(Data.a); //静态初始化
// System.out.println(Data.e); //静态初始化
}
}
class Data{
static{
System.out.println("静态初始化");
}
public static final int i1 = 7;
public static final Integer i2 = 5;
public static final Boolean b1 = true;
public static final boolean b2 = true;
public static final String s1 = "0";
public static final String s2 = new String("0");
public static final A a = new A();
}
class A{
}
从代码结果上看可以总结为:java中的编译期常量包括java八大基本类型和直接声明的string类型。当然要求是常量就必须要final修饰。
所以回到我们最开始的那段代码发现str1和str2的区别在于str2加了final修饰而且是直接声明的string类型,故str2就可以实现宏替代,所以在编译时编译器就会让finalstr2和finalstr3都指向字符串池中缓存的字符串”“hello world”,所以它们就是同一个对象。