In this case you created an instance of Sub and called a method of the super class. There are two methods here called f(). There is the f()(Tester) and f()(Sub). Because f()(Tester) is private it can not be overridden. The system knows this and therefore treats f()(Sub) as a separate and unrelated method. To the JVM these two methods have different internal names. When you invoked g() and it called f(), the JVM knew that f() in Tester could not be overridden so it did not go looking in the sub classes for identical methods (the dynamic binding stuff) it just used the method that was right there.
Static methods are a bit different from private methods. Since the static methods are class level methods, they are resolved at compile time and available at class load time (even with no instance of the class created) and do not participate in
polymorphism. In order to have overriding and hidden methods etc. the method needs to be resolved at runtime.
PS: there is a little pad and pencil icon on each post that can be used to edit the post it if is your own. Good thing cuz I fat finger all the time.