My first step would be to take it out of that pretty ugly form. When I see a ; after a method call, I would hit enter to move the next call to the next line. From there just go line by line to see what the code is doing. Since this appears to be about object creation/assignment, creating an object diagram of some type showing what reference is pointing to what object would be a good thing.
When I die, I want people to look at me and say "Yeah, he might have been crazy, but that was one zarkin frood that knew where his towel was."
//m3.go() is valid so "hi" is printed
//m4 is referring to m3.m1, m3.m1 is referring to m2, which is also valid
//so "hi is printed for m4.go()
//m5 is referring to m2.m1 which has been initialized with default value, so
//NullPointerException is thrown when m5.go() is invoked