Что staticозначает модификатор , когда применяется к декларации переменной является то , что переменная является переменной класса , а не переменная экземпляра. Другими словами ... есть только одна num1переменная и только одна num2переменная.
(Кроме того: статическая переменная похожа на глобальную переменную в некоторых других языках, за исключением того, что ее имя не отображается везде. Даже если оно объявлено как a public static, неполное имя отображается только в том случае, если оно объявлено в текущем классе или суперклассе. , или если он импортируется с использованием статического импорта. В этом различие. Настоящий глобальный вид нигде виден без уточнения.)
Поэтому , когда вы смотрите obj.num1и obj.num2вы на самом деле имея в виду на статические переменные, вещественные обозначения A.num1и A.num2. И аналогично, когда конструктор увеличивает num1и num2, он увеличивает те же переменные (соответственно).
Непонятная морщина в вашем примере заключается в инициализации класса. Класс инициализируется, сначала инициализируя по умолчанию все статические переменные, а затем выполняя объявленные статические инициализаторы (и блоки статического инициализатора) в том порядке, в котором они появляются в классе. В этом случае у вас есть это:
static A obj = new A();
static int num1;
static int num2=0;
Бывает так:
Статика начинается с начальных значений по умолчанию; A.objравно nullи A.num1/ A.num2равны нулю.
Первое объявление ( A.obj) создает экземпляр A(), а конструктор для Aприращений A.num1и A.num2. Когда объявление завершается, A.num1и A.num2они оба 1, и A.objссылаются на вновь созданный Aэкземпляр.
Второе объявление ( A.num1) не имеет инициализатора, поэтому A.num1не меняется.
Третье объявление ( A.num2) имеет инициализатор, который присваивает ноль A.num2.
Таким образом, в конце инициализации класса A.num1есть 1и A.num2есть 0... и это то, что показывают ваши операторы печати.
Это сбивающее с толку поведение на самом деле связано с тем, что вы создаете экземпляр до завершения статической инициализации и что используемый вами конструктор зависит от статического объекта, который еще не инициализирован, и изменяет его. Этого вам следует избегать в реальном коде.