This is about the difference between objects and variables.
In Java, variables (of non-primitive type) are references to objects. So, the variable is not the object itself, it's only a reference (something like a pointer, if you know C).
In line 3, you declare two variables str1 and str2. Note that you don't initialize them there - at that point, they're not referring to any String objects yet.
In line 4, you're making str1 refer to a String that contains "Free the bound periodicials.".
In line 5, you're making str2 refer to the same String object that str1 refers to. Note: Probably you're misunderstanding something here. You are not making the variable str2 a reference to the variable str1 - you're just making str2 refer to the same object that str1 refers to. There is no direct link between the variables str2 and str1.
In line 6, you make str1 refer to another String object that contains "Peanuts". Note that str2 doesn't know anything about this - it is still referring to the object that contains "Free the bound periodicials.". (There is no link between variables str2 and str1).
In line 7, you make str2 refer to a new String object that contains "Free the bound periodicials.test" (the contents of the object that str2 was referring to is concatenated with "test" into a new String object, and then str2 is assigned to refer to that new String object).
Indeed, the important thing to understand is that the variables are not the actual objects, they're just references to objects (so, you can for example make two variables refer to the same object).
Looking at a line like this (I added a missing closing parenthesis):
You're calling the substring method on the String object that str1 refers to. That method will return a new String object that will contain part of the original String object. The new String object is then passed to the println() method. The println() method ofcourse has an argument variable; it's defined in class PrintStream (because System.out is a PrintStream):
So, when you make the call, x is made to refer to the String object, and println() will do what it does.