Какова цель наличия защищенных методов в классе 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 ответа
Важно контролировать "видимость" элементов в классе. (См. Учебник по языку здесь)
В качестве краткого резюме рассмотрим:
private
вещи видны толькоclass
они вno modifier/default
видны толькоclass
иpackage
класс находится вprotected
вещи видныpackages
,class
И чтобыsub-classes
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()
по умолчанию ничего не делает, но подклассы могут (как правило, не должны) выполнять там специальные операции очистки, когда объект собирается мусором.