在java.lang.Object类中拥有受保护方法的目的是什么?

时间:2014-03-03 19:05:14

标签: java openjdk

当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
   }
  }

3 个答案:

答案 0 :(得分:1)

控制课堂中元素的“可见性”非常重要。 (参见语言tutorial here

作为简短摘要,请考虑:

  1. private只有class
  2. 的内容才能看到这些内容
  3. no modifier/default仅对class可见,而package类在
  4. 中 {li> protected packagesclasssub-classes 可以看到内容 {li> public packageclasssub-classes和世界可见一些内容

答案 1 :(得分:0)

是的,因为它们可以在扩展类和同一个包中看到,但是在其他任何地方都没有。如果a.B extends Objectb.C extends Object不是a.B,则无法调用b.C#clone()方法。

与finalize相同。您可以在受保护的情况下覆盖它,但不能从任何可能的上下文中调用它。

答案 2 :(得分:0)

protected方法/变量/ ..通常仅用于子类。

protected在同一个包中也可见,但这通常不是意图,因为在默认情况下保持可见性(即未定义privateprotected之一或public)。

因此,protected方法的典型意图是子类可以覆盖该方法以专门化该行为,或者允许它们调用该方法(但外部类不是 - 目标:封装)

例如Object#finalize()默认情况下不执行任何操作,但是当对象被垃圾回收时,子类可以(通常不应该)在那里执行特殊的清理操作。