В Java мы используем метод set и get для доступа к полю. В вашем примере у нас есть класс Dog, расширяющий класс Animal.
Но если вы объявите его как Animal, если вы вызываете непосредственно поле Amimal dog1 = new Dog();
, вы создаете экземпляр Dog, но объявляетесь как Animal, поэтому, когда вы вызываете dog1.name
, он дает вам значение Animal.