前言:
此刻同学们对“java objects类”都比较讲究,小伙伴们都想要分析一些“java objects类”的相关内容。那么小编也在网上网罗了一些关于“java objects类””的相关知识,希望各位老铁们能喜欢,兄弟们快快来了解一下吧!前言:Object类是所有Java类的超类,如果一个类没有明确的指出超类,它的超类就是Object。Java中,所有类都是由Object类扩展而来的。本文对Object类做一个简单记录。
1、可以使用Object类型的变量引用任何类型的对象,但也只能用作各种值的通用持有者,如果想对对象内容进行操作,仍然需要对象的原始类型。
2、equals方法:检测两个对象是否相等。
2.1、Object类中使用equals方法判断两个对象是否具有相同的引用,如果两个对象的引用相同,则它们一定是相等的。例如 有obj1和obje2具有相同的引用,则obj1.equals(obj2)返回true。
提示:为了预防obj1和obj2可能为null的情况,可以使用Objects的equals(Object a, Object b)方法:
Objects.equals(Object a, Object b)
2.2、equals方法特性:
(1)自反性:对于任何非空引用x,x.equals(x)返回true;
(2)对称性:对任何引用x和y,当且仅当y.equals(x) 返回true,x.equals(y)也应返回true。
(3)传递性:对任何引用x、y和z,如果x.equals(y)返回true,y.equals(z)返回true,则x.equals(z)返回true。
(4)一致性:如果x和y引用的对象没有发生变化,反复调用x.equals(y)应返回同样的结果。
(5)对任意非空引用x,x.equals(null)返回false。
2.3、编写equals方法的建议:
(1)显示参数命名为otherObject,稍后需要将它转换成另一个叫做other的变量;
(2)检测this与otherObject是否引用同一个对象:
if(this==otherObject) return true;
这是经常采用的方式,也仅是一个优化。计算这个等式比逐个比较类中的域代价小的多。
(3)检测otherObject是否为null,如果为null,返回false。这是非常必要的。
if(otherObject==null) return false;
(4)比较this与otherObject是否属于同一个类。如果equals的语义在每个子类中有所改变,就使用getClass检测:
if(getClass()!=otherObject.getClass()) return false;
如果所有子类都拥有统一的语义,就使用instanceof检测:
if(!(otherObject instanceof ClassName)) return false;
(5)将otherObject转换为相应的类类型变量:
ClassName other=(ClassName)otherObject
(6)对所有需要比较的域进行比较。使用==比较基本类型域,使用equals比较对象域。如果所有域都匹配,返回true,否则返回false。如果在子类中重新定义了equals,就要在其中包含调用super.equals(other) 。
3、hashCode方法:散列码(hash code)是由对象导出的一个整型值,没有规律。两个不同的对象的散列码基本不会相同。
3.1、hashCode默认值:每个对象都有一个默认的散列码,其值为对象的存储地址。
3.2、如果重新定义了equals方法,则必须重新定义hashCode方法,以便用户可以将对象插入散列表中。注意:最好使用null安全的Objects.hashCode方法,如果参数为null,该方法返回0,否则返回对参数调用hashCode的结果;使用静态方法Double.hashCode来避免创建Double对象。如果需要组合多个散列值,可以调用Objects.hash方法。
3.3、equals和hashCode的定义必须一致:如果x.equals(y)返回true,则x.hashCode()必须与y.hashCode()值相同。
标签: #java objects类