/**********************************************************************************
 * Since Strings are immutable, and every time you update you get a new String,
 * How do I update a string in a method?
 * ANSWER: You must return the new String
 *********************************************************************************/
public class passByString
{
    public static void main (String[ ] args)
    {        
        String name1 = new String("hello");                 //create a String object
    
        System.out.println("\t\t\t" + "Orig String     New String");
        System.out.println("\t\t\t" + "--------------------------");

        System.out.println("Sent to method.....: \t" + name1 );

        System.out.print("\t reference.: \t" + reference(name1));      //print the reference 
        System.out.println("\n"); 

        String name2 = passByTest(name1);             //call the passByTest method and return a new String

        System.out.println("After the method...: \t" + name1 +"\t\t"+ name2);

        System.out.print("\t reference.: \t" + reference(name1));     //print the reference 
        System.out.print("\t"                + reference(name1)); 
        System.out.println("\n"); 
    }

   /*****************************************************************************
    * A passBy method to test how Strings are manipulated
    *
    * @param  name1 - type String       - an object which is a String type
    * @return name1 - type String 
    ****************************************************************************/
    static String passByTest(String name1)              //Receive a String      
    {
        System.out.println("..String received..: \t" + name1 );
    
        System.out.print("\t reference.: \t" + reference(name1));       //print the reference 
        System.out.println("\n"); 

        name1 += " world";                              //change the String - you get new object

        System.out.println("..String changed to: \t\t\t" + name1 );

        System.out.print("\t reference.: \t\t\t" + reference(name1));   //print the reference 
        System.out.println("\n"); 

        return(name1);                                  //return the new String object 
    }

   /****************************************************************************************
    * Return a reference value for an object
    ****************************************************************************************/
    static String reference(Object obj)                   
    {
        String ref = Integer.toHexString(System.identityHashCode(obj));     
        return ref;
    }
}