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

Posted

技术标签:

【中文标题】为啥只有 clone 和 finalize 是对象类中的受保护方法?【英文标题】:why only clone and finalize are protected method in object calss?为什么只有 clone 和 finalize 是对象类中的受保护方法? 【发布时间】:2019-04-25 01:08:46 【问题描述】:

我了解将 clone 和 finalize 方法设置为受保护的目的,我想了解为什么 hashcode() 和 equals 方法没有声明为受保护

【问题讨论】:

简单地说,因为你想在课堂之外使用这些 【参考方案1】:

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

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

【讨论】:

嗨@antoniossss,感谢您的回复,但是 Object 类是所有类的根包,所以我相信它应该对所有类都可用。 clone 和 finalize 方法受到保护的另一个原因是使用受保护或公共可见性覆盖它。那么为什么不使用 hashcode 和 equals 你错了。 protecteda.b.Class 的方法在包 a.b 中可见,但在 a.b.z 中不可见【参考方案2】:

您“了解将 clone 和 finalize 方法设置为受保护的目的”。但实际上目的是什么?

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

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

与这两种方法相比,Object.equalsObject.hashCode 可供使用,而不是供内部使用。

Object.hashCode 的 JavaDoc 说:

支持这种方法是为了有利于哈希表,例如那些 由HashMap提供。

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

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

【讨论】:

以上是关于为啥只有 clone 和 finalize 是对象类中的受保护方法?的主要内容,如果未能解决你的问题,请参考以下文章

11.JAVA-Object类之finalize(),clone(),toString()等方法覆写

Object类中的方法

Java进阶 - Object类

java的object类函数详解

为啥 Object.clone() 在 Java 中是原生的?

eclipse中定义的private变量保存之后都成final是为啥