Възможен дубликат:
Защо методът finalize() в java.lang.Object е защитен?
Методът за финализиране е дефиниран със защитен обхват, тогава как е възможно някой друг обект, като например събирача на отпадъци, да може да го извика.
Възможен дубликат:
Защо методът finalize() в java.lang.Object е защитен?
Методът за финализиране е дефиниран със защитен обхват, тогава как е възможно някой друг обект, като например събирача на отпадъци, да може да го извика.
Тъй като събирачът на боклук е част от спецификацията на езика и следователно може да прави всичко, което спецификацията на езика казва, че може.
protected не е същото като private и събирачът на боклук може да има достъп до него, дори ако е частен.
Защо е методът finalize() в java.lang. Защитен обект?
Това е магията на JVM. Точно като извикване на частни методи по време на сериализация
От гледна точка на спецификацията на езика на Java, събирачът на отпадъци не е обект и не се управлява от нормалните правила за достъп. Той е „част от JVM“ и може да прави неща, които обикновеният Java код не може. (Наистина, вероятно изобщо не е реализиран като Java код!)
Помисли за това. Ако GC трябваше да отговаря на правилата за достъп, тогава той нямаше да има достъп до private
полета на обекти по време на фазата на маркиране и следователно не можеше да определи дали обектите са достъпни. С други думи, няма да може да изпълни изискванията на JLS за управление на паметта.