2
respostas

Dúvida no exercício 2

Galera, a dúvida que tenho pode ser simples, mas não me recordo no momento. Qual seria o resultado/motivo do código abaixo apresentado no exercício?

Tributavel t = cc;

O que isso faz basicamente?

2 respostas

Olá Gustavo,

Neste código estamos atribuindo uma referência do tipo ContaCorrente para uma referência do tipo Tributavel. Isso significa que a partir desse ponto, sempre que nos referenciamos a nossa conta corrente utilizando a referência t, sabemos apenas que a referência é um Tributavel e portanto só podemos invocar os métodos declarados nessa interface.

Então o que será que acontece se tentarmos fazer o seguinte código?

System.out.println(t.calculaTributos());

Nesse caso, o código compila normalmente e imprime os tributos da nossa conta corrente. Mas e se tentássemos compilar e executar o código abaixo:

System.out.println(t.getSaldo());

Agora temos um erro de compilação pois durante a compilação, a única coisa que o compilador sabe sobre t é que ela é uma referência para um Tributavel. Esse Tributavel poderia ser uma ContaCorrente mas também poderia ser um SeguroDeVida que também é um Tributavel mas que não tem o método getSaldo()! Por isso o compilador não se arrisca e não deixa o código acima compilar.

Fazer a atribuição de uma conta corrente para um tributável de forma isolada como vemos no exercício a primeira vista não tem grande utilidade mas demonstra que podemos utilizar interfaces para aumentar as possibilidades de uso do polimorfismo.

Podemos por exemplo ter um método:

public void imprimeTributos(Tributavel t) {
    System.out.println(t.calculaTributos());
}

Esse método pode ser invocado passando uma ContaCorrente ou um SeguroDeVida como parâmetro e isso só é possível pois essas duas classes implementam a interface Tributavel e possuem o método calculaTributos(). Tudo isso só é possível pois somos capazes de executar a instrução inicial, onde:

ContaCorrente cc = new ContaCorrente();
Tributavel t = cc;

ou

SeguroDeVida sdv = new SeguroDeVida();
Tributavel t = sdv;

que é exatamente o que acontece quando passamos algum desses tipos no lugar do parâmetro t no método imprimeTributos(Tributavel t).

Significa que o objeto 't' do tipo 'Tributavel', está apontando para o mesmo local de memória do objeto 'cc' do tipo ContaCorrente. Todos os dados inseridos nos atributos do objeto 'cc', serão atualizados no objeto 't'. Porém o objeto 't' só terá acesso aos métodos que estão na interface Tirbutavel.