为什么只有clone和finalize是对象类中的受保护方法?

问题描述 投票:1回答:2

我理解使clone和finalize方法保护的目的,我想理解为什么hashcode()和equals方法没有被声明为protected

java object equals hashcode protected
2个回答
6
投票

因为你想从给定类的外部调用hashcodeequals方法。

protected只允许从同一个包和扩展类访问。


1
投票

您“理解使克隆和最终方法成为受保护的目的”。但实际上目的是什么?

如果未覆盖该方法并且未实现Object.clone,则调用Cloneable将抛出异常。因此,该方法尚未准备好使用。

Object.finalize是根据JavaDoc“被垃圾收集器调用”。因此它仅供内部使用。

与此相反,这两种方法都是Object.equalsObject.hashCode准备使用而不是内部使用。

JavaDocObject.hashCode说:

支持此方法的好处是哈希表,例如HashMap提供的哈希表。

因此,它旨在被其他对象使用。如果hashCode不会被声明为public,则此功能将被限制使用。

Object.equals是一种symmetric方法。如果Object.equals不会被声明为public,假设我们有一个来自另一个包的类型的局部变量b,其equals方法对this不可见。如果bthis相等,我们想要ckeck。我们不能打电话给b != null && b.equals(this),但我们仍然可以打电话给this.equals(b)。将对称方法限制为仅由两个对象之一调用是否有意义? 另见Comparable

© www.soinside.com 2019 - 2024. All rights reserved.