I don't know what is the different between invoking a static synchronized method and a synchronized method in run().
And what will happen if we redefine the static methods of the super class?
Could you please explain it?
You are saying the opposite of what the code is doing. You will not redefine the method in the super class. Instead in this code the static method is redefined in the sub class. Look at this code
Since two different methods are called which lock on different objects, so both the methods can be executed concurrently by two threads. Method 1 locks on HighTop.class and Method 2 locks on LowTop.class