Ответ
Один объект. Компилятор Java выполняет оптимизацию, известную как конкатенация строковых литералов на этапе компиляции. Оба литерала объединяются в один, и в пуле строк (String Pool) кучи создается единственный объект "Hello World".
// Код после компиляции эквивалентен:
String a = "Hello World";
Почему? Потому что оба операнда — строковые литералы, известные на этапе компиляции.
Контраст с runtime-конкатенацией:
String b = "Hello";
String c = b + " World"; // Создается новый объект StringBuilder, затем новая строка "Hello World" в куче.
В этом случае результат не является литералом, и конкатенация происходит во время выполнения, что приводит к созданию дополнительных объектов.