【问题标题】:Why The methods in Object Class Are Protected?为什么对象类中的方法受到保护?
【发布时间】:2015-05-02 17:09:35
【问题描述】:

为什么类对象中的方法受到保护以及为什么它不公开有什么正当理由吗?

protected native Object clone() throws CloneNotSupportedException;

【问题讨论】:

  • 它是 Java 如何处理克隆的实现细节。 IMO 关于Cloneable interface 的文档可以提供帮助(per-se 你甚至可能有一个公共 Object.clone() 方法,即使几乎总是抛出异常,但是使用这个 pattern 你将基类给出的基本行为分开)。

标签: java


【解决方案1】:

如果类 C2 扩展了 C1,并且 C1 包含公共方法,那么 C2 中的方法(如果被覆盖)也必须是公共的; Java 使得在覆盖时对方法的访问施加额外限制是非法的。如果 C1 包含受保护的方法,则 C2 中的覆盖方法可能是受保护的或公共的。

这是 stackoverflow 接受的更多详细信息的答案

Why does the Object class in Java contain protected methods?

【讨论】:

    【解决方案2】:

    这允许类的设计者决定类是否适合支持克隆。 protected Object.clone() 方法是一个类调用来实现克隆...如果它想要本地克隆机制。

    如果我希望我的类是可克隆的,我添加一个公共克隆方法;例如

    public class MyClass implements Cloneable {
        ....
        public Object clone() {
            super.clone();
        }
    }
    

    如果我想让克隆在内部可用,我会写:

    public class MyClass implements Cloneable {
        ....
        // Don't provide a public override for `clone()`.
    }
    

    如果我不想克隆,我会写:

    public class MyClass {
        ...
    }
    

    相比之下,如果Object.clone()public,那么理论上每个对象都会支持克隆……就编译器而言!这将是一件坏事,因为有很多类克隆​​没有意义、有害或无法实现。


    finalize() 的情况下,如果任意代码可以启动对象的终结逻辑,那将是有害的。只有 GC 这样做才有意义,或者在某些情况下类及其子类这样做才有意义。

    请注意,如果您确实实现了finalize() 方法,建议链接到超类finalize();例如

      protected void finalize() {
          // Do my finalization
          super.finalize();
      }
    

    ...即使超类当前有一个终结器。

    【讨论】:

    • By contrast, if Object.clone() was public, then every object would notionally support cloning ... 即使 Object.clone 受保护也适用,因为所有子类都可以访问受保护的方法,并且所有类都是 Object 类的子类
    • 这不是真的。访问意味着某个类的方法可以在this 或同一类或子类的其他实例上调用clone()。它不允许在不相关类的实例上调用 clone()。试试看!
    猜你喜欢
    • 2018-09-26
    • 2019-04-25
    • 1970-01-01
    • 1970-01-01
    • 2019-10-09
    • 1970-01-01
    • 2011-01-18
    • 2015-08-14
    • 2014-10-09
    相关资源
    最近更新 更多