Это называется «анонимный внутренний класс».
Анонимные внутренние классы - это классы, которые создаются внутри другого класса, но не имеют имен. Они создаются в соответствии с их интерфейсом или определением абстрактного базового класса, а их отсутствующая реализация находится в одном ряду с экземпляром.
В этом случае MenuItem является абстрактным - в нем отсутствует метод run (). Вы предоставляете реализацию его метода run () в строках 2-4.
Посмотрите эту статью JavaWorld для получения дополнительной информации о различных типах и использовании внутренних классов.
Что касается второй части вашего вопроса "в чем разница между созданием экземпляров объектов внутри определений методов и в" разделе переменных экземпляра ", как это?" - разница в объеме, и когда объект создается.
Нестатические переменные-члены с начальными значениями создаются при создании экземпляра объекта, который их содержит. Начальное присвоение значения (инициализация) также выполняется в это время.
Статические переменные-члены с начальными значениями создаются и инициализируются, когда класс загружается загрузчиком классов виртуальной машины. С нетерпением ClassLoading это произойдет в начале приложения. При использовании отложенного ClassLoading это произойдет при первом обращении к классу приложения. Я считаю, что по умолчанию большинство классов, не являющихся частью среды выполнения Java, загружаются лениво.
Как статические, так и нестатические переменные-члены имеют область действия уровня объекта и доступны другим объектам в соответствии с их модификатором доступа (общедоступным / частным / защищенным).
Нестатические переменные-члены являются частью экземпляра объекта и, как таковые, они помечаются для сборки мусора, когда этот экземпляр теряется или выходит из области видимости. Переменные статического члена собираются только в том случае, если класс, содержащий их, выгружен. Это происходит только в том случае, если экземпляр ClassLoader, который загрузил указанный класс, является сборщиком мусора. См. этот вопрос для получения дополнительной информации об этом.
Локальные переменные (переменные, которые определены в методе) с начальными значениями создаются и инициализируются, когда эта строка выполняется как часть нормального выполнения метода. Они помечаются для сборки мусора (уничтожаются) после выхода из области видимости (после завершения выполнения метода, в котором они содержатся).