【问题标题】:What is the purpose of having protected methods in java.lang.Object class?在 java.lang.Object 类中具有受保护方法的目的是什么?
【发布时间】:2014-04-04 23:49:37
【问题描述】:

当 Java 中的每个类都派生自 java.lang.Object 时,那么在 Object 类中具有受保护方法的目的是什么? 它们将始终具有与公共方法相同的可见性。是否有任何理由在 OpenJDK 实现中保护以下两种方法?

    protected native Object clone() throws CloneNotSupportedException;

    protected void finalize() throws Throwable { }

编辑:说明 new Object.finalize() 的评论是我能预料到的最佳答案! ..谢谢

对于那些区分受保护和公共可访问性的人

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

【问题讨论】:

  • 为什么您认为protectedpublic 具有相同的知名度?如果是这样的话,就不需要这两个修饰符了。
  • 试试new Object().finalize();
  • 这绝对是令人困惑的——Java 可见性符号有些不规则,并不总是 100% 有意义。在某种程度上,你必须接受它本来的样子。

标签: java openjdk


【解决方案1】:

控制类中元素的“可见性”很重要。 (见语言tutorial here

作为一个快速总结,考虑:

  1. private 事物仅对它们所在的 class 可见
  2. no modifier/default 仅对类所在的 classpackage 可见
  3. protected packagesclasssub-classes 可以看到事物
  4. publicpackageclasssub-classes 和世界都可以看到事物

【讨论】:

    【解决方案2】:

    是的,这很正常,因为它们对于扩展类和在同一个包中是可见的,但在其他任何地方都看不到。如果a.B extends Objectb.C extends Objecta.B不能调用b.C#clone()方法。

    finalize 也是如此。您可以覆盖它,因为它受到保护,但您不能从任何可能的上下文中调用它。

    【讨论】:

      【解决方案3】:

      protected 方法/变量/.. 通常只对子类有用。

      protected 在同一个包中也是可见的,但这通常不是本意,因为在保留默认可见性时已经涵盖了这种情况(即未定义privateprotectedpublic 之一)。

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

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

      【讨论】:

        猜你喜欢
        • 2011-01-18
        • 2010-10-01
        • 2014-03-04
        • 2015-06-28
        • 2019-04-25
        • 2015-05-02
        • 1970-01-01
        相关资源
        最近更新 更多