Olá Everton!
O método "adiciona" da classe GerenciadorDeImpostoDeRenda recebe como parâmetro um tipo "Tributavel" ( como mostrado abaixo) e simplesmente soma o valor dos tributos que recebe, através da chamada ao método "calculaTributos", incrementando o resultado na propriedade "total":
void adiciona(Tributavel t) {
System.out.println("Adicionando tributável: " + t);
total += t.calculaTributos();
}
O que temos que lembrar é que "Tributavel" é na verdade é uma interface, ou seja, um contrato ou uma regra que cada classe que a implementa deve seguir. Se olharmos para interface Tributavel veremos que ela "obriga", simplesmente por constar na sua definição, a implementação do método "calculaTributos".
Como as classes "SeguroDeVida" e "ContaCorrente" implementam a interface Tributavel elas obrigatoriamente devem possuir um método chamado "calculaTributos". Então, quando a execução do programa chega nas linhas:
gerenciador.adiciona(sv); e gerenciador.adiciona(cc);
A JVM (Java Virtual Machine), em tempo de execução, reconhece que "sv" é um objeto do tipo SeguroDeVida e que "cc" é um objeto do tipo "ContaCorrente". Portando, a JVM sabe que para o objeto sv deverá ser chamado o método calculaTributos da Classe SeguroDeVida e para o objeto cc deverá ser chamado o método calculaTributos da classe Conta Corrente.
Esse comportamento só é possível por que ambas as classes (ContaCorrente e SeguroDeVida) implementam a interface "Tributavel" e, pelo fato de implementarem essa interface é certo que elas terão o método calculaTributos.
Espero ter ajudado!