Its pretty straight forward.
You have decalred a no-argument constructor and an overloaded constructor which takes a String as an argument. Thus whenever you call new on an instance of the class, the constructor will either run with the no-argument constructor which initializes nothing, or it takes a string which returns initializes the String variable to the value "Hello".
Since you are calling your print function on test2.s, test2 is a new instance of test in which you have not pased a String variable, and thus the instance will initialize the test2 instance using the no-argument constructor. Therefore s has not been initialized by you with any value and thus gets a null from the JVM.
If you had done the same with an int you would get 0, a boolean, false and so on.
[ October 03, 2008: Message edited by: Stephen Davies ]