Please read, compile, and run the provided code. Try GiveADogABone with ArrayListNaive (commented out, line 30) and ArrayListBest.
Explanation of a failure of Object-Oriented design and encapsulation.
I should not have to know how a public method is implemented; that is a core principle of OOP. However, this is an issue when public methods (that I have overriden and called super in) may call other public methods (that I have overriden and called super in).
You may think this is a trivial problem in the case provided, but think if adding were not such a simple task. Let us say that I did not understand at all how add or addAll worked or if addAll did some other unknown tasks in the background, so I absolutely need to call super on both add and addAll.
The problem is that, without knowing how my ArrayList is implemented (naive vs. best), I do not know whether I should override add to insert my bark or BOTH add and addAll to insert my bark. Does addAll call add, or do both add and addAll call a private helper method to do the actual implentation? As the user of the ArrayList API, I have no idea.
My conclusion is that the standard should be to call a private helper method to do actual implementation when making public methods, so the user extending the class does not have to guess (although, he will have to rely on the implementer of the API to follow the standard). The user will know that he should override all the public methods that he wants his logic to exist in.