Think of the process of using Intents to start Activities as being analogous to instantiating objects using the Java new keyword. Example...
MyClass.java
public class MyClass {
}
In some other code...
MyClass exampleClass = new MyClass();
In Android Activities are in essence simply just Java classes - they are, however, 'special' classes and as such we don't use new to instantiate them. Instead we ask the Android system to instantiate them for us.
In the example you give, you are defining explicitly which Activity class to instantiate...
MainActivity.java
public class MainActivity extends Activity {
}
Then in some other code you use the following...
Intent intent = new Intent (this, MainActivity.class);
startActivity(intent);
The call to startActivity(...) is the way of asking the Android system to instantiate a 'new' instance of MainActivity.
As has been mentioned in the other posts, this method requires passing an Android Context which in this case is done using this. What that means is the application component which is requesting to create a new instance of MainActivity is passing itself as the Context.