为什么对象类中有公共方法?它们可以受到保护,并以更私密的方式保持相同的行为

时间:2015-04-24 07:15:56

标签: java private public protected access-specifier

至于java体系结构关注“尽可能保密。”这就是为什么finalize方法在对象类中受到保护。

protected void finalize() throws Throwable { }

Why is the finalize() method in java.lang.Object “protected”?请看看Mehrdad Afshari的答案。

然后为什么许多其他方法如equals(),toString(),wait(),notify()公开。他们可以受到保护,他们仍然保留现有的行为。受保护的原因导致问题?``

3 个答案:

答案 0 :(得分:3)

尝试拨打finalize

new Object().finalize();

它不会编译:子类只能访问相同类型的其他对象上的受保护方法。

如果equalstoStringwaitnotify受到保护,我们无法自由访问它们。

In JLS terms...

  

C成为声明受保护成员的类。只允许在S的子类C的正文中访问。

     

此外,如果Id表示实例字段或实例方法,则:

     
      
  • 如果通过字段访问表达式E.Id或方法调用表达式E.Id(...)或方法引用表达式E::Id进行访问,其中E主要表达式,当且仅当E的类型为SS的子类时才允许访问。
  •   

简单来说,受保护的成员可以在...上访问

  • ...本身:

    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将无效。因此,它们必须公开。