Динамическая диспетчеризация Java может видеть только методы, определенные в текущем классе или его суперклассах.Поскольку A не определяет метод, он не может видеть, что B определяет его, и вы получаете сообщение об ошибке.
Однако, если у метода есть любой доступ, отличный от private, B может переопределить его и, следовательно, вызвать метод в экземпляре.B будет динамически отправляться в реализацию B, даже когда доступ к методу осуществляется через тип экземпляра "A".