Pergunta

O que são interfaces?

Resposta

Uma interface é uma especificação de métodos que uma classe possuir em sua interface, ou seja, uma interface descreve os métodos públicos que uma classe deve implementar bem como as convenções de chamada a serem respeitadas (quantidade e tipo de parâmetros além do tipo de retorno de cada método).

Interfaces são uma idéia originada na linguagem Objective C e se propõe a oferecer um mecanismo alternativo a herança múltipla (que não é suportada pelo Java). Uma classe pode extender apenas uma única classe (herança simples - veja JavaFaq0069) embora possa implementar várias interfaces diferentes. Polimorficamente, qualquer classe que implementa uma certa interface I pode ser tratada como um elemento do tipo I. Veja abaixo um exemplo de interface:

public interface Preco {
  public float preco();
  public void reajuste(float p);
}

No exemplo dado a interface Preco especifica que os métodos preco e reajuste devem ser implementados conforme indicado. Isto permite que qualquer classe que implemente tal interface possa ser tratada externamente como uma classe Preco.

Desta forma uma interface não contêm código implementado, mas apenas declarações de métodos, seus parâmetros e seu retorno. É responsabilidade da classe que implementa uma interface prover a codificação necessária para os métodos especificados na interface. Abaixo um exemplo de uma classe que implementa a interface Preco.

public classe Automovel implements Preco {
  private float precoAutomovel;

  // codificação da interface Preco
  public void reajuste(float p) {
    precoAutomovel = p;
  }
  public float preco() {
    return precoAutomovel;
  }
}

Desta forma, a classe Automovel pode ser utilizada como sendo do tipo Preco, ou seja, pode-se obter o preço ou efetuar-se o reajuste do preço de qualquer objeto de qualquer classe que implemente a interface Preco. Podemos verificar se um dado objeto implementa um certa interface através do operador instanceof, como abaixo:

public static void obtemPreco(Object o) {
  if (o instanceof Preco) {
    System.out.println("Preço é: " + o.preco());
  } else {
    System.out.println("Preço não disponível");
  }
}

Qualquer tipo de objeto pode ser passado para o método obtemPreco que testa tal objeto verificando se é do tipo Preco, caso em que aciona o método preco para obter tal informação. Nos demais casos apenas imprime uma mensagem. Isto mostra que as interfaces podem ser utilizadas também para marcar objetos como sendo de um determinado tipo e, portanto, possuindo certas características conhecidas.