The fact that protected methods can be accessed by classes that don't inherit from the defining class has always bothered me. I use abstract protected methods quite often in abstract classes to let subclasses define pieces of functionality. These are, in effect, private methods - they aren't intended be called outside of the class hierarchy. However, Java doesn't give me a way to say this, since protected methods can be called by any class in the package.
My question is, what is the design rationale for allowing this? Is there a valid use case for needing a method that can be called only in the package or by random subclasses outside of the package? I have never run into this case and I'm wondering if others have.