I don't know if I can explain the entire event mechanisms used by the awt.event api but I can explain a bit about what good the getSource method of the event object is.
Example 1:
In the above code, you only require 1 actionPerformed() method. The e.getSource() will help you determine which button was clicked so you can perform the correct action. You pretty much already stated this.
The other option, and the one I prefer, is to code it like this...
This difference here being that a new ActionListener object is created for every single button. I like this simply because it makes more sense to me and I don't have a single method full of if else's. However, the drawback to this is you create a lot more objects in memory.
The only time I really use a single object and implmenet the action on the class is for things like MouseListeners, FocusListeners. Basically listeners that it usually doesn't matter which component the action is on, but the same action occurs regardless. For example, I created an application one time where I needed JTextFields highlighted when they gained focus. So I implemented a FocusListener on my class. Then on focusGained I would highlight whatever JTextField I had. I still had to use getSource because I needed the instance of the JTextField object I had focus on, but I didn't care about anything beyong that. No if else's.
I hope I didn't confuse you more by this post.