Какова цель наличия защищенных методов в классе java.lang.Object?

Когда каждый класс в Java происходит от java.lang.Object, тогда какова цель наличия защищенных методов в классе Object? Они всегда будут иметь ту же видимость, что и публичные методы. Есть ли какая-то причина, почему следующие два метода защищены в реализации OpenJDK?

    protected native Object clone() throws CloneNotSupportedException;

    protected void finalize() throws Throwable { }

Изменить: комментарий о новой 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
   }
  }

3 ответа

Важно контролировать "видимость" элементов в классе. (См. Учебник по языку здесь)

В качестве краткого резюме рассмотрим:

  1. private вещи видны только class они в
  2. no modifier/default видны только class и package класс находится в
  3. protected вещи видны packages, class И чтобы sub-classes
  4. public вещи видны package, class, sub-classes И мир

Да, это делает sanse, так как они будут видны для расширения классов и в том же пакете, но нигде больше. Если a.B extends Object а также b.C extends Object чем a.B не могу позвонить b.C#clone() метод.

То же самое с доработкой. Вы можете переопределить его, поскольку он защищен, но вы не можете вызвать его из любого возможного контекста.

protected методы / переменные / .. обычно предназначены для использования только из подклассов.

protected также виден в том же пакете, но это, как правило, не является целью, так как этот случай уже рассматривается при оставлении видимости по умолчанию (т.е. не определяя одно из private, protected или же public).

Таким образом, типичное намерение protected Метод заключается либо в том, что подклассы могут переопределять этот метод для специализации поведения, либо в том, что им разрешено вызывать этот метод (но внешние классы не являются таковыми - цель: инкапсуляция)

Например Object#finalize() по умолчанию ничего не делает, но подклассы могут (как правило, не должны) выполнять там специальные операции очистки, когда объект собирается мусором.

Другие вопросы по тегам