Hi Afroz, I think the reason for making finalize() as protected is that all derived classes must call the base classes finalize() as well. If you make them anything else, chances are the that the derived classes may not invoke the base class' finalize() method. Hence even making them public will not solve the purpose.
finalize() simply shouldn't be called from the outside at all - it is called by the JVM before an object.
clone() should only be called from the outside on classes which implement the Clonable interface. Those classes can then make the method public.
Does that help?
The soul is dyed the color of its thoughts. Think only on those things that are in line with your principles and can bear the light of day. The content of your character is your choice. Day by day, what you do is who you become. Your integrity is your destiny - it is the light that guides your way. - Heraclitus
clone() is an odd function. One reason clone() is defined in the Object class is because that's a good private place to stick the default implementation (a shallow copy) without worrying about the security implications that would pop up if the default implementation were a static method in another class somewhere that could clone any class at all.