The answer to the main question is easy to answer:
Is it common practice to always use super to call methods outside the superclass, even if I DO NOT override the method?
No, this is not a common practice. On the contrary, it is dangerously confusing. You usually call methods because the main point of inheritance is to allow classes to override methods to modify / extend their behavior. Usually you don’t care at what level the method is actually implemented.
The obvious exception is that you yourself override the method and want / need the functionality of the parents.
Now to the dangerously confusing part of the explicit super call:
public class CallSuper { static class Parent { public void foo() { System.out.println("Parent.foo"); } public void bar() { System.out.print foo(); } } static class Child extends Parent { public void foo() { System.out.println("Child.foo"); } public void bar() { super.foo(); } } static class GrandChild extends Child { public void foo() { System.out.println("GrandChild.foo"); } } public static void main(String[] args) { Parent p = new Parent(); Parent c = new Child(); Parent g = new GrandChild(); System.out.print("Parent.foo() = "); p.foo(); System.out.print("Child.foo() = "); c.foo(); System.out.print("GrandChild.foo() = "); g.foo(); System.out.print("Parent.bar() = "); p.bar(); System.out.print("Child.bar() = "); c.bar(); System.out.print("GrandChild.bar() = "); g.bar(); } }
If you run this example, it will output (added line numbers for clarity):
1 Parent.foo() = Parent.foo 2 Child.foo() = Child.foo 3 GrandChild.foo() = GrandChild.foo 4 Parent.bar() = Parent.foo 5 Child.bar() = Parent.foo 6 GrandChild.bar() = Parent.foo
The first four lines are not surprising, we get what foo implements at each level, respectively, Parents bar, calling it foo. It starts to become odd on line 5. The child bypasses its own override foo by calling super.bar (), so when its foo () is specialized, bar () is not. On line 6, you see that GrandChild inherits this oddity from Child, so the somewhat innocent look super.foo () in the child bar has now broken GrandChild's expectation that its redefinition of foo () is also effective for all bar ().
Now, if you imagine that foo () and bar () are actually doing something useful and that they have a meaningful relationship with each other, for example. you believe (either through parenting documentation or just common sense) that overriding foo () will also change the behavior of bar (). The “super” child breaks this.
Generally, if you see a call to "super.x ()" somewhere outside of the actual override of "x ()", this may happen by accident.