这个表达式评估的是什么?

时间:2014-11-06 06:17:45

标签: java operators

Class Wrapper{

  psvm(){

  Integer i=new Integer(5);
  Float f=new Float(5);

  }
}

如果(i==f && i.equals(f)) //第一个表达式求值为????和第二个表达式评估为???

 System.out.println("i == f returns " + (i == f) + " and equals returns " + i.equals(f)); 

2 个答案:

答案 0 :(得分:1)

在Java中,测试

if (i==f && i.equals(f))

是荒谬的。由于iIntegerfFloat,因此它们永远不会是==(因为它们是不相称的类型,因此无法合法地与==)。对于引用类型,仅当变量引用相同的对象时,==运算符才会求值为true,而对于不同类型的对象,它们不能这样做。因此,由于i==f的计算结果为false,所以第二部分永远不会被评估,因为&&运算符是一个“短路”布尔运算符。

我认为如果if属于其他类型,这可能是检查类的equals()方法是否具有反身性的方法(根据规范要求,但有总是编程错误)。但是,拥有它会更有意义:

if (i != null && i.equals(f))

避免潜在的NullPointerException

答案 1 :(得分:-1)

String a=new String("sag"); 
String b=new String("sag"); 

System.out.println("a == b returns " +(a == b)+ " and equals returns " + a.equals(b)); 

答案是:假,是吗?正确