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.