最终参考变量的意义

时间:2012-01-31 17:18:58

标签: java string

String a="A";
String b="B";
final String c="C";
final String d="D";

String e=a+b;
String f=a+b;
System.out.println(e==f);//false

String g=c+d;
String h=c+d;
System.out.println(g==h);//true

为什么会这样? String对象是在特殊内存中创建的,称为字符串常量池。但这里最终变量的意义是什么。

4 个答案:

答案 0 :(得分:4)

最终关键字会阻止您重新分配变量到不同的String实例。因此,虽然String本身是不可变的,但除非明确标记为final,否则可以更改引用它的变量。

现在,我对你在这里遇到的确切语义不太确定。但总的来说,由于变量是final,c+d现在可以被视为编译器常量(它永远不会有"CD"以外的值。该值在编译时计算,它本身可以是被视为一个常数,被放入实习字符串池中。

答案 1 :(得分:1)

final表示您将无法在程序中稍后修改此String的值。也:

  

如果最终变量包含对象的引用,那么状态为   对象可以通过对象的操作来改变,但是   变量总是引用同一个对象。 (source

答案 2 :(得分:1)

Java编译器发现你已经将变量声明为final(使它们成为常量而不是变量),在编译时计算c+d,并将结果内化。

答案 3 :(得分:1)

编译器发现c和d是最终的。这意味着编译器知道c和d永远不会改变。因此它将代码编译为

String g = "CD"; 
String h = "CD";
因此,g和h是对同一个STring文字的两个引用,它是实习的。

他不能以同样的方式优化e和f,因为a和b不是最终的,因此可以改变。