I used to wonder why all methods in the java.lang.Object is public and only finalize is protected. Finalize is just a callback method which is supposed to be called by the JVM. So, ideally, it should be private. Here is a mind- blowing explanation of why finalize is protected?
method-protected.html