O que acontece quando um literal de string é alterado? [duplicado

Esta pergunta já tem uma resposta aqui:

Java é "passagem por referência" ou "passagem por valor"? 78 respostastoUpperCase em Java não funciona 5 respostas

Eu quero mudar uma literal de string para uma maiúscula. Aqui está o meu código:

    // a and b are the same literal 
    String a = "Test";
    String b = "Test";
    // now I want to change all b's letter 
    // into uppercases, but fail.
    b.toUpperCase();
    System.out.println("a = " + a + ", " + "b = " + b);
    // print: a = Test, b = Test

    String c = "Test1";
    System.out.println("c = " + c + " , c.toUpperCase() = "
                + c.toUpperCase());
    // print: c = Test1 , c.toUpperCase() = TEST1

    // change letters of "Test" literal 
    // into uppercase and success
    System.out.println("Test".toUpperCase());
    // print: TEST

Minha pergunta é: 1.b não pode ser alterado para maiúsculo, masc e"Test" pode. Por quê

O que eu sei é: 1.a eb referência ao mesmo objeto no conjunto de cadeias. 2. String é imutável, mas não parece relevante para esta pergunt

questionAnswers(7)

yourAnswerToTheQuestion