龙空技术网

Java核心技术知识点笔记—所有类的超类Object

书生听雨景阑珊林 85

前言:

此刻同学们对“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类