Что происходит при изменении строкового литерала? [Дубликат]

На этот вопрос уже есть ответ:

Является ли Java «передачей по ссылке» или «передачей по значению»? 78 ответовtoUpperCase в Java не работает 5 ответов

Я хочу изменить строковый литерал на заглавные. Вот мой код:

    // 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

Мой вопрос: 1.b нельзя перевести в верхний регистр, ноc а также"Test" может. Зачем

Что я знаю: 1.a а такжеb ссылка на тот же объект в пуле строк. 2. Строка неизменна, но, похоже, не имеет отношения к этому вопросу.