D二、java操作符中需要注意的几个知识点

前言:

     关于操作符的种类和语法大家都是比较清楚的,这里重点详细去了解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方法,所以可以放心的使用,至于覆盖后面会提到的。

扫描二维码关注公众号,回复: 9457221 查看本文章

二、类型转换操作符中截尾和舍入

     我们不去强调类型转换,大家都很清楚,这里要介绍的是当进行窄转换时截尾和舍入问题。例如,如果将一个浮点数转换为整数,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

后记:

     如果有误,请评论指出哦,谢谢,继续冲鸭!

发布了93 篇原创文章 · 获赞 193 · 访问量 1万+

猜你喜欢

转载自blog.csdn.net/qq_43919400/article/details/104236835