Duvida apostila fj21, servlets "13.3 - Criando um controlador e um pouco mais de reflection"

Oi pessoal estou estudando a apostila da Caelum e não entendi uma instância criada envolvendo interface, vou tentar perguntar direito vamos lá…

primeiramente ele cria uma interface:

public interface BusinessLogic {
void execute(HttpServletRequest req, HttpServletResponse res) throws Exception;
}

depois ele implementa a mesma:

public class TestaMVC implements BusinessLogic {

public void execute(HttpServletRequest req, HttpServletResponse res)
throws Exception {
System.out.println(?Executando a logica e redirecionando…?);
RequestDispatcher rd = req.getRequestDispatcher("/testamvc.
jsp");
rd.forward(req, res);
}
}

até ai tudo bem, agora a criação da classe controler…

public class ControllerServlet extends HttpServlet {
public void service(HttpServletRequest request, HttpServletResponse response)
throws ServletException, IOException {
String businessLogicClassName = request.getParameter(“business”);
Class businessLogicClass = null;
try {
businessLogicClass = Class.forName(businessLogicClassName);
} catch (ClassNotFoundException e) {
throw new ServletException("Não encontro a classe " +
businessLogicClassName);
}
if (!BusinessLogic.class.isAssignableFrom(businessLogicClass)) {
throw new ServletException("classe não implementa a interface: "

  • businessLogicClassName);
    }
    BusinessLogic businessLogicObject = null;
    try {
    businessLogicObject = (BusinessLogic) businessLogicClass.newInstance(); [color=red]aqui está a duvida[/color]
    }
    catch (InstantiationException e) {
    throw new ServletException(e);
    }
    catch (IllegalAccessException e) {
    throw new ServletException(e);
    }
    try {
    businessLogicObject.execute(request, response);
    }
    catch (Exception e) {
    throw new
    ServletException(?A lógica de negócios causou uma
    exceção?, e);
    }
    }
    }

então esta linha : businessLogicObject = (BusinessLogic) businessLogicClass.newInstance();

ele cria uma interface na linha acima, ou seja businessLogicObject é do tipo BusinessLogic, não entendo por quê
uma interface está recebendo a intância da classe e depois ele chama o execute da interface: businessLogicObject.execute(request, response);

ele não deveria usar a classe que implementa a interface tanto para criar a classe quanto para executar o método execute? se alguém puder exclarecer eu agradeço desculpe a quantidade de texto…

Obrigado

Ola!

Isso é por causa do polimorfismo! De uma olhada no capitulo de heranca e no de interfaces do FJ11. Ele cria ai uma referencia para algum objeto que implemente aquela interface. O legal dai é que a partir desse momento nao precisamos saber exatamente para qual objeto ele aponta, basta saber que ele possui o metodo execute! Essa é a grande vantagem de programar voltar a interface

Puxa! muito obrigado Paulo Silveira pela dica… estudei polimorfismo pelo Use a Cabeça porém não havia estudado sobre interface nesse contexto de polimorfismo valeu demais… Obrigado pela força.