Entender herança não é dificil. O que é mais dificil é entender Visibilidade e Acesso.
Ora, se B herda de A, então B tem tudo o que A tem, porque B é-um A. Então, não existe esse negócio de herda/não herda. É mais simples pensar que herda tudo e pronto.
Mas agora que B herdou as coisas de A, como B acessa essas coisas ? Fazendo chamadas. Mas ele pode fazer todas as chamadas que quiser ? Não. É aqui que entram os niveis de visibilidade.
O que A declarou como private é só dela. Então, B vai herdar essas coisas, mas não as vai ver. Não terá acesso a elas. (No lingo diz-se que B não herda, mas ele herda sim, o problema é que ele não enxerga, então é com se, não herdasse).
O que A declarou como public, B tb vê. Esta é fácil.
Agora, como A pode dar permissão de visibilidade às suas clases filhas, mas a mais ninguém ? Com o protected.
O que é protected em A é visibel em B, mas para mais nínguem.
finalmente temos o escopo default. Este escopo é especial porque ele é relacionado ao pacote. O que é default em A será visivel em todas as classes do mesmo pacote, mesmo que não haja herança entre elas. (É por isto que o nivel de visibilidade é mais relevante que o conceito de herança, porque a herança é apenas um dos fatores possiveis). Então se B está no mesmo pacote que A, ele tem acesso ao que é nível default em A.
Se B está num pacote diferente de A, então apenas o que é public e protected em A será visivel a B.
É preciso entender que java trabalha com escopos , e a herança é apenas uma forma de manipular o escopos (tal como quando vc usa chaves dentro do código, o java cria um escopo novo). Os níveis de visibiliade é que realmente comandam quem vê o quê.