【发布时间】:2019-04-25 01:08:46
【问题描述】:
我了解将 clone 和 finalize 方法设置为受保护的目的,我想了解为什么 hashcode() 和 equals 方法没有声明为受保护
【问题讨论】:
-
简单地说,因为你想在课堂之外使用这些
标签: java object equals hashcode protected
我了解将 clone 和 finalize 方法设置为受保护的目的,我想了解为什么 hashcode() 和 equals 方法没有声明为受保护
【问题讨论】:
标签: java object equals hashcode protected
因为您想从给定类的外部调用 hashcode 和 equals 方法。
protected 只允许从同一个包和扩展类进行访问。
【讨论】:
protected 类 a.b.Class 的方法在包 a.b 中可见,但在 a.b.z 中不可见
您“了解将 clone 和 finalize 方法设置为受保护的目的”。但实际上目的是什么?
如果方法未被覆盖且Cloneable 未实现,则调用Object.clone 将引发异常。因此,此方法尚未准备好使用。
Object.finalize 根据JavaDoc“被垃圾收集器调用”。因此,它仅供内部使用。
与这两种方法相比,Object.equals 和 Object.hashCode 可供使用,而不是供内部使用。
Object.hashCode 的 JavaDoc 说:
支持这种方法是为了有利于哈希表,例如那些 由
HashMap提供。
因此,它旨在供其他对象使用。如果hashCode 不被声明为public,则此功能的使用将受到限制。
Object.equals 是一个symmetric 方法。如果Object.equals 不会被声明为public,假设我们有一个来自另一个包的类型的局部变量b,并且equals 的方法对this 不可见。我们想检查b 和this 是否相等。我们不能打电话给b != null && b.equals(this),但我们仍然可以打电话给this.equals(b)。将对称方法限制为只能由两个对象之一调用是否有意义?
另见Comparable。
【讨论】: