Но согласно тому же действию c, каждый класс или интерфейс имеют FQN.
Нет: документы, которые вы цитируете говорят (выделено мое):
Каждый тип примитива, именованный пакет, верхний уровень класс и верхний уровень интерфейс имеет полностью определенное имя
О классах-членах, интерфейсах-членах и типах массивов они говорят (выделено мной):
- У класса-члена или интерфейса-члена M другого класса или интерфейса C есть полное имя если и только если C имеет полное имя.
- Тип массива имеет полное имя, если и только если его тип элемента имеет полное имя name.
И (акцент все еще мой):
A локальный класс или анонимный класс не имеет полностью определенного имени.
Так что не только анонимные классы, но и некоторые классы-члены, интерфейсы-члены и типы массивов могут не имеют полностью определенного имени, а локальные классы никогда не делают. Вот демонстрация некоторых примеров:
class Outer {
// anonymous class has no FQN
Runnable r = new Runnable() {
// member class has no FQN, because its enclosing class has no FQN
class Member {}
public void run() {
// array type has no FQN, because its element type has no FQN
Member[] members = new Member[3];
// local class has no FQN
class Local {}
}
};
}