This week's book giveaway is in the OO, Patterns, UML and Refactoring forum. We're giving away four copies of Refactoring for Software Design Smells: Managing Technical Debt and have Girish Suryanarayana, Ganesh Samarthyam & Tushar Sharma on-line! See this thread for details.
Please use the CODE button; your code is illegible without. I edited your post with the CODE button and found your indentation is wrong, so it is still difficult to read.
You will find lots of old threads about that keyword; I found no 1, No 2, No 3 and No 4.
In the instance you are using, the printer object calls the static "out" field of the System class, which calls its println() method and prints the object you happen to be in at the moment. Details of the println method and how it handles an object can be found in here and here in the API documentation.
here you are passing Data object in to the print() method and thats the reason you could access the getData() method in the printer class. Also as the printer object was created and then p.print() was called, this might confuse you as which object is passed .. but as the keyword this is called from inside the class Data, the object of type Data is passed.