为啥只有 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】:因为您想从给定类的外部调用 hashcode
和 equals
方法。
protected
只允许从同一个包和扩展类进行访问。
【讨论】:
嗨@antoniossss,感谢您的回复,但是 Object 类是所有类的根包,所以我相信它应该对所有类都可用。 clone 和 finalize 方法受到保护的另一个原因是使用受保护或公共可见性覆盖它。那么为什么不使用 hashcode 和 equals 你错了。protected
类 a.b.Class
的方法在包 a.b
中可见,但在 a.b.z
中不可见【参考方案2】:
您“了解将 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
。
【讨论】:
以上是关于为啥只有 clone 和 finalize 是对象类中的受保护方法?的主要内容,如果未能解决你的问题,请参考以下文章
11.JAVA-Object类之finalize(),clone(),toString()等方法覆写