Я отвечаю на ваш вопрос другим вопросом:
Почему finalize
метод не должен быть защищен?
В общем, вы должны стараться держать вещи как можно более приватными. Вот что такое инкапсуляция. В противном случае вы можете сделать все public
. finalize
не может быть private
(поскольку производные классы должны иметь возможность доступа к нему, чтобы иметь возможность его переопределить), поэтому он должен быть по крайней мере protected
, но зачем выделять больше доступа, когда это нежелательно?
После более внимательного прочтения вашего комментария, я думаю, теперь я понимаю вашу главную мысль. Я думаю, что ваша точка зрения такова, поскольку все происходит от java.lang.Object
и, следовательно, обращается к его protected
членам, для него (или для любого метода в java.lang.Object
в этом отношении) не будет иметь значения public
, в отличие от protected
. Лично я бы посчитал это недостатком дизайна в Java. Это действительно исправлено в C #. Проблема не в том, почему finalize
защищен. Это нормально. Реальная проблема заключается в том, что вы не сможете вызывать защищенные методы в базовом классе через ссылку на объект типа базового класса. У Эрика Липперта есть запись в блоге , в которой обсуждается, почему предоставление такого доступа защищенным членам является плохой идеей, которая более подробно рассматривается в переполнении стека в этом вопросе .