/******************************************************************************
 * Print the reference of a StringBuffer object while being manipulated
 ******************************************************************************/
public class zStringBufRef
{
    public static void main (String[] args) 
    {
        System.out.println(">> Initial value of StringBuffer...");
        StringBuffer X = new StringBuffer("Hello World");
        printRef(X,"X","");
        System.out.println();		

        System.out.println(">> Assigning to another StringBuffer...");
        StringBuffer Y = X;
        printRef(Y,"Y","");
        System.out.println();		

        System.out.println(">> Making a change to Y...");
        Y = Y.replace(0,999,"Goodbye World");
        printRef(X,"X","");
        printRef(Y,"Y","");
        System.out.println();		

        System.out.println(">> Concatenate without reassignment");
        Y.append(" Again");
        printRef(Y, "Y", "");

        System.out.println(">> Concatenate with reassignment");
        Y = Y.append(" Again");
        printRef(Y, "Y", "");
 
        System.out.println();		
        StringBuffer Z = changeValue(X);										//calling the method
        System.out.println();		

        System.out.println(">> AFTER THE METHOD...");
        printRef(Z,"Z","");
        printRef(X,"X","");
    }
    static StringBuffer changeValue(StringBuffer A)
    {
        System.out.println("    >> IN THE METHOD...");
        printRef(A,"A","    ");
        
        System.out.println("    >> Making a change by replacing A...");
        A = A.replace(0,999,"Adios World");									//Replaces the value in place
        printRef(A,"A","    ");
 
        System.out.println("    >> Making a change by assignment to A...");
        A = new StringBuffer("Goodbye World");								//A is now pointing to a new object
        printRef(A,"A","    ");
 
        return A;
    }
    static void printRef(StringBuffer str, String name, String indent)
    {
        System.out.printf("%s StringBuffer %s=%-28s is at reference: %d %4$x \n", indent, name, str, System.identityHashCode(str) );
    }
}