黑马程序员技术交流社区

标题: 一个简单的例子,考验你的知识点是否过关 [打印本页]

作者: zhuoxiuwu    时间: 2015-7-6 20:55
标题: 一个简单的例子,考验你的知识点是否过关
”下面的Java 程序试图要测试这项宣言。那
么,它将打印出什么呢?
  1. public class AnimalFarm{
  2. public static void main(String[] args){
  3. final String pig = "length: 10";
  4. final String dog = "length: " + pig.length();
  5. System.out. println("Animals are equal: "
  6. + pig == dog);
  7. }
  8. }
复制代码


对该程序的表面分析可能会认为它应该打印出Animal are equal: true。毕竟,
pig和dog都是final的string类型变量,它们都被初始化为字符序列“length:
10”。换句话说,被pig 和dog 引用的字符串是且永远是彼此相等的。然而,==
操作符测试的是这两个对象引用是否正好引用到了相同的对象上。在本例中,它
们并非引用到了相同的对象上。
你可能知道String类型的编译期常量是内存限定的。换句话说,任何两个String
类型的常量表达式,如果标明的是相同的字符序列,那么它们就用相同的对象引
用来表示。如果用常量表达式来初始化pig 和dog,那么它们确实会指向相同的
对象,但是dog 并不是用常量表达式初始化的。既然语言已经对在常量表达式中
允许出现的操作作出了限制,而方法调用又不在其中,那么,这个程序就应该打
印Animal are equal: false,对吗?
嗯,实际上不对。如果你运行该程序,你就会发现它打印的只是false,并没有
其它的任何东西。它没有打印Animal are equal: 。它怎么会不打印这个字符
串字面常量呢?毕竟打印它才是正确的呀!谜题11 的解谜方案包含了一条暗示:
+ 操作符,不论是用作加法还是字符串连接操作,它都比 == 操作符的优先级高。
因此,println 方法的参数是按照下面的方式计算的:
System.out.println(("Animals are equal: " + pig) == dog);
这个布尔表达式的值当然是false,它正是该程序的所打印的输出。

作者: 357955778    时间: 2015-7-6 21:07
学习了!
作者: Morgan    时间: 2015-7-6 21:44
真给力呀!




欢迎光临 黑马程序员技术交流社区 (http://bbs.itheima.com/) 黑马程序员IT技术论坛 X3.2