Object:所有类的超类
Object类是java是所有类的始祖,在java中每个类都默认拓展了Object。
Object类型的变量:
可以使用Object类型的变量引用任何类型的对象。
在java中只有基本类型(数值,字符,布尔)不是对象。所有数组类型都继承了Object类。
Object obj=new Employee();
Object类型的变量只能用作各种值的一个泛型容器。想对其中的内容进行具体操作,还需要清楚对象的原始类型,并进行相应的强制类型转换。
equals方法:检测一个对象是否等于另一个对象。
不过,经常需要根据字段检测对象是否相等。
getClass方法返回一个对象所属的类,只有两个对象属于同一个类时,才有可能相等。
Objects.equals(a,b):
如果两个参数都为空,返回true;如果两个参数有一个为空,返回false
否则,如果两个参数都不为null,则调用a.equals(b)
如果在子类中定义equals方法,首先调用超类的equals,如果检测失败,就不可能相等。
编写equals方法的建议:
如果在子类中重新定义equals,就要调用super.equals(other)
hashcode方法:
hashcode(散列码)是由对象导出的一个整型值。
hashcode是没有规律的,两个不同对象hashcode基本上不会相同。
hashcode方法定义在Object类中,因此每个对象都有一个默认的散列码,其值由对象的存储地址得出。
如果重新定义了equals方法,就必须为用户可能插入的对象重新定义hashcode方法。
当需要组合多个散列值时,可以调用Objects.hashcode
equals与hashcode定义必须相容。如果定义Employee.equals比较员工的ID,那么hashcode就需要ID,而不是姓名或存储地址。(两个相等的对象返回相等的散列码)
toString方法:
绝大多数的tostring都遵循:类名[A="a1",B="b1",.....]的格式
优化:类名可以用getClass.getName获取。
子类应定义自己的toString方法,如果超类使用了getClass().getName(),子类只需要调用super.toString()即可。
toString方法的调用:
(1)字符串拼接:“ ..”+对象
(2)System.out.println(对象)
建议:应为每一个类添加toString方法,便于调试。
数组打印: