Java Object -- 所有类的父类

Object 是 Java 中所有类的父类,即使没有显示声明,编译器也会默认加上,Object 这个父类存在的意义,大概就是给所有的类都添加几个默认的方法。为什么 Java 的开发者认为所有的类都需要这几个方法?这足以说明这几个方法的重要性,所以我认为,所有的 Java 开发者,都应该对这几个方法的功能有着一定的了解。getClass()这个方法能够返回某个对象在运行时的类型,即将这个对象实例...
摘要由CSDN通过智能技术生成

Object 是 Java 中所有类的父类,即使没有显示声明,编译器也会默认加上,Object 这个父类存在的意义,大概就是给所有的类都添加几个默认的方法。为什么 Java 的开发者认为所有的类都需要这几个方法?这足以说明这几个方法的重要性,所以我认为,所有的 Java 开发者,都应该对这几个方法的功能有着一定的了解。

getClass()

这个方法能够返回某个对象在运行时的类型,即将这个对象实例化时使用的类,特别的,当一个类是匿名内部类的时候,因为它并没有一个对应的有名字的类,所以在求一个匿名内部类的 Class 类型的时候,得到的是一个代号形式的类,其类名只是系统自动生成的一个编号类。

一般情况下使用这个方法的时候有两种:在程序运行的过程中,我们可以通过获取两个对象的类型从而判断某两个对象是否是同一个类;或者,是为了反射。反射是 Java 提供的一种功能,通过反射,我们可以无视 Java 的一些限制访问机制,直接使用某个类的私有变量或私有方法。而进行反射的一般步骤就是,首先通过对象得到它所对应的类型,然后通过 Class 类提供的一些方法得到对应的变量或者方法,然后再通过这些 Field 类和 Method 类直接访问某个对象的某个变量或者方法,而不是通过一般的通过.操作符。反射相比较于一般情况下通过.操作符的调用机制来说,它一方面能够在运行时更加自由地操控对象的属性,另一方面,它能够无视 Java 的封装机制使用到一些在正常情况下无法使用的功能。

hashCode()

调用一个对象的hashCode()方法能够得到一个整形数值,这个整形数值就叫做对象的 hashCode ,一般来说 hashCode 会用于一些哈希表的实现,如 Java 中的 HashMap ,另外,对于hashCode()这个方法来说,有以下几个要求:

  1. 同一个对象多次调用hashCode()方法时的结果必须相同
  2. 如果两个对象在equals()方法看来是相等的,那么它们的 hashCode 也必须相同
  3. 如果两个对象在equals()方法看来是不相等的,那么它们的 hashCode 并非必须不同

简而言之,就是hashCode()需要是对象恒定的,且与equals()在相同方面保持一致。对于第一个条件很好理解,如果同一个对象在不同的时刻拥有不同的 hash 值,那么那些基于 hash 值的数据结构如 HashMap 就无法正常工作了,这就违反了hashCode()存在的意义。其实第二个条件也是因为类似的原因,我们通过equals()方法来判断两个对象是否是相等的,以 HashMap 为例,存放一个键值对的时候,首先通过取 key 的 hash 值来决定它应该放在哈希表的哪个位置上,然后取值的时候也是通过取 key 的 hash 值到达对应的位置再继续寻找。那么如果出现两个 key 的在equals()看来相同,也就是它们被认为是相等的对象,但是 hash 值却不同的话,就可能出现存值的时候通过 hash 值存在了 i 位置上,但是取值的时候因为 hash 值不同而到 j 位置上取了,那么此时虽然本来能够取到值却没有取到的情况,所以,为了防止这种情况的发生,对于所有相等的对象,其 hash 值也就必须也是相同的才行。

equals()

equals()方法就是用来判断两个对象是否相等,如果我们有需要,我们可

  • 5
    点赞
  • 13
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值