当Java中的每个类派生自java.lang.Object时,在Object类中拥有受保护方法的目的是什么? 它们将始终具有与公共方法相同的可见性。在OpenJDK实现中是否有任何理由保护以下两种方法?
protected native Object clone() throws CloneNotSupportedException;
protected void finalize() throws Throwable { }
编辑:说明新的Object.finalize()的评论是我能预料到的最佳答案! ..Thanks
对于那些区分受保护和公共
的可访问性的人 package pkg1;
public class Parent{
protected void fun(){}
}
package pkg2;
public class child extends pkg1.Parent{
void fun2()
{ child ch=new child();
ch.fun(); // Accesses protected method (For this class protected /public is irrelevant in terms of accessibility
Parent p=new Parent();
//p.fun(); //can't do this
}
}
答案 0 :(得分:1)
控制课堂中元素的“可见性”非常重要。 (参见语言tutorial here)
作为简短摘要,请考虑:
private
只有class
no modifier/default
仅对class
可见,而package
类在protected
packages
,class
和sub-classes
可以看到内容
{li> public
package
,class
,sub-classes
和世界可见一些内容
醇>
答案 1 :(得分:0)
是的,因为它们可以在扩展类和同一个包中看到,但是在其他任何地方都没有。如果a.B extends Object
和b.C extends Object
不是a.B
,则无法调用b.C#clone()
方法。
与finalize相同。您可以在受保护的情况下覆盖它,但不能从任何可能的上下文中调用它。
答案 2 :(得分:0)
protected
方法/变量/ ..通常仅用于子类。
protected
在同一个包中也可见,但这通常不是意图,因为在默认情况下保持可见性(即未定义private
,protected
之一或public
)。
因此,protected
方法的典型意图是子类可以覆盖该方法以专门化该行为,或者允许它们调用该方法(但外部类不是 - 目标:封装)
例如Object#finalize()
默认情况下不执行任何操作,但是当对象被垃圾回收时,子类可以(通常不应该)在那里执行特殊的清理操作。