Ocorre quando uma classe descendente implementa uma nova versão de um método que existe em alguma classe ancestral, usando exatamente a mesma assinatura. Nesse caso, a nova versão se sobrepõe à versão antiga. Um objeto criado pela classe descendente só poderá acessar a última versão do método. Dentro da classe descendente ainda é possível acessar a versão anterior através da palavra reservada super.
Exemplo:
// Classe ancestral
public class Ancestral {
    . . .
    public void umMetodo(int param){
      . . .
    }
}
 
// Classe descendente
public class Descendente extends Ancestral {
    . . .
    public void umMetodo(int param){
         super.umMetodo(param); // Chamando a versão da classe ancestral
         // Aqui o código acrescentado pela classe descendente
    }
}