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?
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?
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.