前言:
关于操作符的种类和语法大家都是比较清楚的,这里重点详细去了解2个方面的知识点,一个是关系操作符中测试对象的等价性的例子,我在java基础专栏里面有提到过字符串的比较https://blog.csdn.net/qq_43919400/article/details/103833472。但是这里与上面的还是有所区别的,另一个就是介绍类型转换的操作符。
一、测试对象的等价性
“==“”这个符号都是很熟悉的,关于等价性的知识也有着一些理解,但是在做一些关于对象等价性判断的时候还是会犯一些错误,比如下面的例子:
public class relationship {
public static void main(String[] args) {
Integer n1 = new Integer(47);
Integer n2 = new Integer(47);
System.out.println(n1==n2);
System.out.println(n1!=n2);
}
}
正确的输出是:false true,那么为什么是这样的输出呢?
我们发现,上面两个对象的内容是相同的,但是对象的引用时不同的。而“==”和“!=”比较的是对象的引用。举个例子,面包A和面包B(颜色,大小上面都是一样的),但是用“==”比较是却是不同的,因为面包A和面包B占两个不同的存储空间,对于java来说就是两个不一样的东西,所以是不同的。
如果要比较对象的内容而不是引用,那么就要用到equals方法。如下:
public class relationship {
public static void main(String[] args) {
Integer n1 = new Integer(47);
Integer n2 = new Integer(47);
System.out.println(n1.equals(n2));
}
}
//输出就是:true
到这里,你以为你已经了解了equals吗?其实还没有,我们刚干使用的equals其实是Integer对象已经定义好的了,如果我们不用已经有了的对象,再次使用equals,那么结果还是一样的吗?
class Value{
int i;
}
public class relationship {
public static void main(String[] args) {
Value n1 = new Value();
Value n2 = new Value();
n1.i = n2.i = 100;
System.out.println(n1.equals(n2));
}
}
此时结果是:false
其实equals默认行为是比较引用,而上面我们用到的Integer对象其实重写了equals方法,如下:
public boolean equals(Object obj) {
if (obj instanceof Integer) {
return value == ((Integer)obj).intValue();
}
return false;
}
先进行判断是不是Integer对象,然后进行比较。而我们自己定义的类创造的对象没有对equals进行覆盖,所以就不会去比较对象的内容,而是比较引用,因此返回是false。java类库中都实现了equals方法,所以可以放心的使用,至于覆盖后面会提到的。
二、类型转换操作符中截尾和舍入
我们不去强调类型转换,大家都很清楚,这里要介绍的是当进行窄转换时截尾和舍入问题。例如,如果将一个浮点数转换为整数,java会如何处理?来看下面的例子:
public class relationship {
public static void main(String[] args) {
double n1 = 0.7,n2 = 0.4;
float n3 = 0.7f,n4 = 0.4f;
System.out.println((int)n1+" "+(int)n2);
System.out.println((int)n3+" "+(int)n4);
}
}
输出结果是:0 0 0 0
显然java对该数字进行了截尾,如果我们需要得到舍入的结果,那么我们就需要使用java.lang.Math中round()方法,例如下面操作:
public class relationship {
public static void main(String[] args) {
double n1 = 0.7,n2 = 0.4;
float n3 = 0.7f,n4 = 0.4f;
System.out.println(Math.round(n1)+" "+Math.round(n2));
System.out.println(Math.round(n3)+" "+Math.round(n4));
}
}
那么输出就是:1 0 1 0
对于round()方法的取整规则可以查看这个大佬的博客https://blog.csdn.net/shruber/article/details/78413706
后记:
如果有误,请评论指出哦,谢谢,继续冲鸭!