Duvida conceitual sobre interface

Lembro de ter lido em um livo que a interface do Java é diferente da interface do design orientado a objetos. Gostaria que alguém comentasse qual a diferença entre as duas, pois não me recordo a diferença e creio ser algo importante.

Jovem,

Não compreendi, pois Java emprega os conceitos de OO, e por isso interface em Java é a mesma coisa definida pela OO. O que java não dá é suporte a herança multipla…será que não é isso que quis dizer???

Lembrei de algo. O livro dizia que deveríamos programar para uma interface e não para uma implementação, do qual ele tinha tirado do livro do Gamma. Só que ele falava que essa interface que o Gamma disse não era exatamente a do Java. Acho que foi no Use a cabeça: padrão de projetos. Ninguém viu nada parecido com isso?

O que vc ta querendo dizer não é usar a Interface ao invés da implementação no código.

Exemplo:
ArrayList lista;

Você deveria:
List lista;

Seria isso?

Não, vou explicar de novo:

O livro diz que a interface da frase do gamma é diferente da interface do Java. Qual a diferença?

Olá!

Interface, como conceito (o que o Gamma quis dizer) diz respeito a como seus objetos podem ser acessados e manipulados. Exemplo:

[code]class Carro {
private int velocidade;
private String status;

public void acelerar(){
    velocidade++;
    status = "correndo";
}

public void frear(){
    velocidade--;
}

public void parar(){
    velocidade = 0;
    status = "parado";
}

public String obterStatus(){
    return status;
}

}

class Moto {
//imagine uma moto aqui…
}

class Main {
public static void main(String[] args) {
if(usuario.escolher().equals(“carro”)) {
Carro c = new Carro();
c.acelerar();
//etc…
} else if (usuario.escolher().equals(“moto”)){
Moto m = new Moto();
m.acelerar();
//etc…
}
}
}[/code]

Como outros objetos conseguem modificar o comportamento e/ou se comunicar (enviar mensagens, chamar métodos) de uma instancia de Carro? Através dos métodos acelerar(), frear(), parar() e obterStatus(). Portanto a interface de Carro é composta por esses 3 métodos. Esse conceito de interface é usado também em hardware, quando dizem “interface de comunicação Serial ou Paralela”, isso quer dizer que a porta de entrada para comunicação com o PC é pela porta Serial ou Paralela.

A interface de um objeto é importante porque diz como ele vai receber as mensagens (receber chamadas de métodos) de outro objeto.

Em Java a interface nada mais é do que uma classe 100% abstrata, uma classe que não possui “recheio” nos métodos. Ela serve para ser implementada de acordo com um comportamento específico. No nosso exemplo poderia existir:

[code]interface Veiculo {
void acelerar();

void frear();

void parar();

void obterStatus();

}

class Carro implements Veiculo {
//classe carro acima…
}

class Moto implements Veiculo {
//classe moto acima
}
[/code]

A vantagem de usar uma interface é que você pode facilmente adicionar novos veículos no seu sistema:

[code]class Main {
public static void main(String[] args) {
Veiculo v = escolherVeiculo(usuario.escolher());
v.acelerar();
//etc…
}

public static Veiculo escolherVeiculo(String escolha) {
    //logica para retornar a implementação de veiculo
    //de acordo com a escolha do usuario
}

}[/code]

No nosso caso ganhamos flexibilidade ao adicionar novos tipos de veículos no sistema, bastando apenas criar uma classe que implemente Veiculo e alterar o método escolherVeiculo para considerar esse novo veiculo. Assim centralizamos a criação dos “Veiculos”.

Esse é só um exemplo do benefício do uso de interfaces.

Abraços

Como o Link_pg explicou, a interface no sentido geral é somente um conceito. Qualquer classe no Java tem a sua própria interface, não necessariamente tem a palavra-chave interface escrito ela.

Interface, em Java, é só uma construção da linguagem que diz que os classes devem implementar os métodos que ela especifica. Essas mesmas classes também poderiam ter mais métodos, fora daqueles definidos na interface que ele implementa, e essa seria a nova interface(referindo ao conceito) do objeto.

Mas, no caso, essa frase do gamma se refere sim as interfaces iguais as do Java…

Especialmente pq ele falou bastante disso quando estava desenvolvendo o Eclipse:
http://www.artima.com/lejava/articles/designprinciples.html

Entretanto, esse conceito pode ser melhor aplicado com templates, no C++, do que com interfaces, no Java.