Object类是所有类的超类、父类,也就是说任何一个类都是由Object继承而来的。但是不包括接口,接口与Object没有继承的关系。接下来讨论Object类中常用的equals和toString方法
1. equals(Object obj)方法:
1.1 原生方法
先看代码:
运行后结果打印出false,是应为,Object中的equals方法被Person类继承了,equals方法的源码是:
也就是说equals是比较2个对象的内存地址,所以p1、p2没有相互赋值,永远都返回false
1.2 overwrite equals方法
由于比较2个内存地址没有太大意义,不同的地址比较也没有可比性,所以可以按需求重写equals方法,去比较p1、p2的成员属性的值
1.3 重写equals的风险避免
由于有多态的向下转型,那么obj参数有可能不是Person类型,所以需要在重写的时候对obj的类型判断
1.4 提高执行效率
由于obj有可能为null,所以提前判断可以避免程序去执行instanceof,直接返回false
也有可能比较的2个对象的地址相同,那么也可直接返回ture
2. toString()方法:
2.1 原生方法
Person类的代码还是1中的代码
TestToString代码如下:
运行程序发现打印s和p的结果是一样的:
com.gamebear.s14.Person@70dea4e
com.gamebear.s14.Person@70dea4e
也就是说,在输出语句中,如果打印一个对象,那么默认调用对象的toString方法
2.2 重写toString方法
我们对一个类的toString,实际上希望看到这个类中的成员的值,而类的地址对用户没有任何实际意义,所以需要重写toString方法
3 注意事项
在开发中,有可能会发现equals和toString方法并不是你想象的结果,是因为这2个方法在新的的类中可能被重写了,一定要去看开发手册和源代码。
如果不符合你的要求,需要再次被重写
例如Scanner类的toString方法
再例如大家熟悉的String类,打印的时候也没有地址,也是因为String的toString方法被重写了