2007年1月20日星期六

AnimalFarm

 
George Wrwell在Animal Farm中说过:"所有的动物都是平等的." 看看下面的东西,你就知道是否是这样的了?

public class AnimalFarm{
    public static void main(String[] args){
        final String pig = "length: 10";
        final String dog = "length: " + pig.length();
        System.out.println("Animals are equal:" +
            pig == dog);
    }
}
 
(代码清单一)
 
初一看该程序,你可能认为它会打印Animal are equal: true.毕竟,pig和dog都是final的string类型变量,而且它们都被初始化为字符序列"length:10".

然而当我们运行程序来验证一下,它是什么呢?结果为:false,并没有打印其他的东西.它没有打印Animal are equal: . 它怎么会不打印这个字符串呢?

 

我把代码进行增补如下:
 
public class AnimalFarm{
    public static void main(String[] args){
        final String pig = "length: 10";
        final String dog = "length: " + pig.length();
        System.out.println("Animals length are equal:" + (pig.length() == dog.length()));
        System.out.println("Animals are equal:" + pig. equals(dog));
        System.out.println("Animals are equal(=):" + (pig == dog));
        System.out.println("Animals are equal(=):" + pig == dog);
        System.out.print("Animals are equal:");
        System.out.println(pig == dog);
    }
}
 
(代码清单二)
 
测试运行:
 
Animals length are equal:true
Animals are equal:true
Animals are equal(=):false
false
Animals are equal:false
 
 
您是否已经发现了结果了呢,我结论是,运算符的优先级造成了这样有意思的影响。
 
因为boolean类型运算符的运算优先级是比较低的,代码行
System.out.println("Animals are equal(=):" + pig == dog);
中先进行字符串连接运算:"Animals are equal(=):" + pig
然后进行字符串间的比较,而"Animals are equal(=):" + pig是不等于dog的
所以最后仅仅输出了false
 
如果代码清单二中代码行
System.out.println("Animals length are equal:" + (pig.length() == dog.length()));
中后面的两个字符串长度比较没有使用括号
则会出现异常
AnimalFarm.java:5: operator == cannot be applied to java.lang.String,int
        System.out.println("Animals length are equal:" + pig.length() == dog.length());
这个异常也说明了上面理解的正确性。
 
 
似乎在一个关于Java怪题(忘记书名)的书上见过类似问题,不知道是否记错了。
 
 

没有评论:

发表评论