至于java体系结构关注“尽可能保密。”这就是为什么finalize方法在对象类中受到保护。
protected void finalize() throws Throwable { }
Why is the finalize() method in java.lang.Object “protected”?请看看Mehrdad Afshari的答案。
然后为什么许多其他方法如equals(),toString(),wait(),notify()
公开。他们可以受到保护,他们仍然保留现有的行为。受保护的原因导致问题?``
答案 0 :(得分:3)
尝试拨打finalize
:
new Object().finalize();
它不会编译:子类只能访问相同类型的其他对象上的受保护方法。
如果equals
,toString
,wait
和notify
受到保护,我们无法自由访问它们。
让
C
成为声明受保护成员的类。只允许在S
的子类C
的正文中访问。此外,如果
Id
表示实例字段或实例方法,则:
- 如果通过字段访问表达式
E.Id
或方法调用表达式E.Id(...)
或方法引用表达式E::Id
进行访问,其中E
是主要表达式,当且仅当E
的类型为S
或S
的子类时才允许访问。
简单来说,受保护的成员可以在...上访问
...本身:
package ex1;
public class Example1 {
protected void m() {}
}
package ex2;
import ex1.Example1;
public class Example2 extends Example1 {{
m(); // m is accessible
}}
... 相同类型的其他实例(或其子类):
package ex3;
import ex1.Example1;
public class Example3 extends Example1 {{
new Example3().m(); // m is accessible
new Example1().m(); // m is NOT accessible
}}
答案 1 :(得分:2)
finalize
无意从外部调用,因为它应包含在equals()
,toString()
,wait()
,{{1}时清理对象的代码旨在从另一个对象调用以确保相等性,字符串表示或其他功能。
答案 2 :(得分:2)
这些方法必须由与调用它们的类无关的类调用。
例如,如果HashMap<SomeClass>
无法调用equals()
的{{1}}和hashCode()
,则SomeClass
将无效。因此,它们必须公开。