Invoking the method "start" and the method "run" are 2 different things.
Invoking start- creates a new
thread of execution. So you invoke super.start() and the method checks that run method is overidden in the class that extends Thread and hence invokes that.
From the Javadoc for Thread#start()
Causes this thread to begin execution; the Java Virtual Machine calls the run method of this thread.
So you can see that JVM calls the run method of this thread. So if you have overridden the run method in your extended class then it invokes that overridden version else it would invoke the run method implementation in the Thread class which is shown below in the below code.
whereas, when you invoke run on Thread, the following is the underlying code that gets invoked:
where target is the Runnable which was passed while creating the instance. [Code taken from Thread.java].
So you can see why the behavior is different for invoking start() and run()