Важное примечание: ответ для случая 4: 11 22 22 * 1001 *
В случае 3: когда A ab = B () исполняемый конструктор B устанавливает переменную stati c a в A, чтобы он имел значение 22.
в случае 4: оба класса A и B имеют поле экземпляра (a) (фактически класс B наследует этот атрибут от класса A), а во время построения сначала выполняется конструктор класса A, а затем конструктор класса B, поэтому, когда у нас есть a a = B (), первый конструктор класса A устанавливает переменную a равной 11, а конструктор класса B устанавливает ее равной 22 stati c. Поле в дочернем классе не переопределяет * поля в родительском классе, они просто скрывают поля stati c в родительском классе, если вы обращаетесь к stati c результат не зависит от типа самого объекта, но зависит от типа ссылки, которую вы используете для доступа к этому объекту. поэтому, когда вы пишете A a = B (), если A и B оба имеют поле stati c, a, результат aa будет a в классе A, а не a в классе B, потому что тип ссылки, которую вы используете для доступа к объекту ct здесь A, а сам тип объекта B.