我理解使clone和finalize方法保护的目的,我想理解为什么hashcode()和equals方法没有被声明为protected
因为你想从给定类的外部调用hashcode
和equals
方法。
protected
只允许从同一个包和扩展类访问。
您“理解使克隆和最终方法成为受保护的目的”。但实际上目的是什么?
如果未覆盖该方法并且未实现Object.clone
,则调用Cloneable
将抛出异常。因此,该方法尚未准备好使用。
Object.finalize
是根据JavaDoc“被垃圾收集器调用”。因此它仅供内部使用。
与此相反,这两种方法都是Object.equals
和Object.hashCode
准备使用而不是内部使用。
JavaDoc的Object.hashCode
说:
支持此方法的好处是哈希表,例如
HashMap
提供的哈希表。
因此,它旨在被其他对象使用。如果hashCode
不会被声明为public
,则此功能将被限制使用。
Object.equals
是一种symmetric方法。如果Object.equals
不会被声明为public
,假设我们有一个来自另一个包的类型的局部变量b
,其equals
方法对this
不可见。如果b
和this
相等,我们想要ckeck。我们不能打电话给b != null && b.equals(this)
,但我们仍然可以打电话给this.equals(b)
。将对称方法限制为仅由两个对象之一调用是否有意义?
另见Comparable
。