Try GiveADogABone with ArrayListNaive (commented out, line 30) and ArrayListBest.
Calling non-final (or non-private) methods on an an Object’s instance from within the Class defining the Object makes the Object's functionality unpredictable.
When User B extends User A’s Class, User B should not have to know the implementation of the Class he is extending, but this example shows why he might need to know the implementation if User A had called non-final (or non-private) methods internally.
Protected final and private methods should do the implementation of functionality. Non-final methods should exist only as APIs for external use.
This also means that non-final protected methods are useless, but this will cause a conflict with the idea of an abstract class (as opposed to an interface).