Вы можете получать доступ к статике из экземпляра, но это действительно плохой вкус, поскольку статика не столько привязана к экземпляру, сколько привязана к классу.
Что бы там ни говорилось в книге,не используйте статики таким образом.И если вы запустите checkstyle и т.п., они тоже предупреждают об этом:)
Кстати, в вашем примере это null.Он где-нибудь инициализируется?
EDIT
Я знаю, что компилятор знает, с чем связан a.DOG, поскольку статика не может быть переопределена.Ему не нужно a для определения вызова, только тип времени компиляции a , который у него есть.
Я также знаю, что пример работает, хотя a равен null (Я пытался, поэтому я знаю:).
Но я все еще думаю, что этостранно, вы можете получить вещи от null .И это сбивает с толку:
Animals a = null;
System.out.println(a.DOG); // OK
a.doSomething(); // NullPointerException
Когда я буду отлаживать NPE, я предполагаю, что a не может быть нулевым, так как println работал нормально.Смущает.
Ах, хорошо, Java.Если вы думаете, что видели все это, вы снова получаете что-то еще:)