Bisogna tenere presente una cosa: stiamo lavorando con degli oggetti. Questo dignifica che quando esegui la quarta istruzione
codice:
rovescia = frase;
fai in modo che rovescia punti alla stessa locazione di memoria a cui punta frase. Quindi, qualsiasi metodo richiamato sull'oggetto rovescia è come se venisse chiamato sull'oggetto frase. Praticamente tu hai un solo oggetto (la stringa) e 2 puntatori ad essa: frase e rovescia.
Quando, poi, stampi il valore di frase e di rovescia stampi lo stesso oggetto.
Per ottenere l'effetto che volevi tu, dovresti fare così:
codice:
BufferedReader tastiera = new BufferedReader(new InputStreamReader(System.in));
StringBuffer frase = new StringBuffer (tastiera.readLine());
StringBuffer rovescia = new StringBuffer( frase );
rovescia.reverse();
System.out.println( frase );
System.out.println( rovescia );
Ciao.