Константа в Java — это атрибут класса или экземпляр класса?

«Константа в Java — это атрибут класса или экземпляр класса?» — вопрос из категории Java Core, который задают на 10% собеседований Java Разработчик. Ниже — развёрнутый ответ с разбором ключевых моментов.

Ответ

Константа в Java — это атрибут (поле) класса, а не экземпляр класса. Точнее, это статическое финальное поле (static final).

Ключевые характеристики:

  1. static: Поле принадлежит самому классу, а не какому-либо объекту. Оно существует в единственном экземпляре в памяти (в области Metaspace/PermGen), независимо от количества созданных объектов.
  2. final: Значение поля может быть присвоено только один раз (при объявлении или в статическом блоке инициализации) и не может быть изменено.

Пример и доступ:

public class MathConstants {
    // Константа — статическое финальное поле класса
    public static final double PI = 3.141592653589793;
    private static final int MAX_RETRIES = 5;
}

// Использование: доступ через имя КЛАССА, а не объекта
double radius = 10.0;
double circleArea = MathConstants.PI * radius * radius;

// Это НЕ константа (это поле объекта, у каждого объекта может быть свое значение)
public class Person {
    private final int id; // final, но не static — поле экземпляра
}

Важно: Для примитивных типов и String (если значение известно на этапе компиляции) такие константы могут быть встроены компилятором прямо в байт-код использующих их классов.