Para programação orientada a objetos, a abstração é uma de suas principais características. Em Java, a abstração OOP pode ser refletida em duas formas: interfaces e classes abstratas. Existem muitas semelhanças e muitas diferenças entre os dois. Muitas pessoas pensam que podem ser usadas de forma intercambiável quando são iniciantes, mas na verdade não são. Hoje aprenderemos sobre interfaces e classes abstratas em Java. Aqui está o esboço do diretório deste artigo:
1. Classe abstrata
2. Interface
3. A diferença entre classes abstratas e interfaces
1. Classe abstrata
Antes de entender as classes abstratas, vamos primeiro entender os métodos abstratos. Um método abstrato é um método especial: ele tem apenas declarações, mas nenhuma implementação concreta. O formato da declaração de um método abstrato é:
Resumo Void Fun ();
Os métodos abstratos devem ser modificados com a palavra -chave abstrata. Se uma classe contém métodos abstratos, esta classe é chamada de classe abstrata. A classe abstrata deve ser modificada com a palavra -chave abstrata antes da classe. Como as classes abstratas contêm métodos sem implementações de concreto, os objetos não podem ser criados usando classes abstratas.
Uma questão deve ser observada abaixo: no livro "Java Programming Thought", as classes abstratas são definidas como "classes contendo métodos abstratos", mas depois se descobriu que, se uma classe não contém métodos abstratos e é apenas modificada com abstrato, também é uma classe abstrata. Em outras palavras, classes abstratas não precisam necessariamente conter métodos abstratos. Pessoalmente, acho que essa é uma pergunta teimosa, porque se uma classe abstrata não contém métodos abstratos, por que ela deve ser projetada como uma classe abstrata? Lembre -se desse conceito por enquanto, e não há necessidade de se aprofundar no porquê.
[Public] Classe Classe Abstract ClassName {Resumo void Fun ();}A partir disso, podemos ver que existem classes abstratas para herança. Se você definir uma classe abstrata, mas não a herdar, é equivalente a criar essa classe abstrata em vão, porque você não pode usá -lo para fazer nada. Para uma classe pai, se um de seus métodos for implementado na classe pai não tiver significado e deve ser implementado de maneira diferente de acordo com as necessidades reais da subclasse, esse método pode ser declarado como um método abstrato, e essa classe se torna uma classe abstrata.
As classes contendo métodos abstratos são chamados de classes abstratas, mas não significam que métodos abstratos só podem ser encontrados em classes abstratas. Como classes comuns, eles também podem ter variáveis de membros e métodos de membros comuns. Observe que existem três diferenças principais entre classes abstratas e classes comuns:
1) O método abstrato deve ser público ou protegido (porque, se for privado, não pode ser herdado pela subclasse e a subclasse não pode implementar o método). Por padrão, é público.
2) Classes abstratas não podem ser usadas para criar objetos;
3) Se uma classe herda de uma classe abstrata, a subclasse deve implementar o método abstrato da classe pai. Se a subclasse não implementar o método abstrato da classe pai, a subclasse também deve ser definida como classe abstrata.
Em outros aspectos, não há diferença entre classes abstratas e classes comuns.
2. Interface
A interface, chamada interface em inglês, em engenharia de software, as interfaces geralmente se referem a métodos ou funções para que outras pessoas liguem. A partir disso, podemos entender a intenção original dos designers de idiomas Java, que é uma abstração do comportamento. Em Java, a forma de uma interface é a seguinte:
[Public] Interface Interfacename {}
Interfaces podem conter variáveis e métodos. No entanto, deve -se notar que as variáveis na interface serão implicitamente especificadas como variáveis finais estáticas públicas (e só podem ser variáveis finais estáticas públicas, e a modificação do privado relatará um erro de compilação), enquanto os métodos serão implicados e específicos, especificados, que não podem ser um método público, o uso de outras palavras -chave, como privado, protegido, still, static, etc. As implementações, ou seja, os métodos na interface devem ser métodos abstratos. A partir daqui, podemos ver vagamente a diferença entre uma interface e uma classe abstrata. Uma interface é um tipo extremamente abstrato. É mais "abstrato" do que uma classe abstrata e geralmente não define variáveis em uma interface.
Para fazer uma aula seguir um grupo específico de interfaces, você precisa usar a palavra -chave implementos, o formato específico é o seguinte:
classe ClassName implementa interface1, interface2, [....] {}
Pode -se observar que uma classe pode seguir várias interfaces específicas. Se uma classe não abstratada seguir uma interface, todos os métodos nessa interface devem ser implementados. Para classes abstratas que seguem uma interface, os métodos abstratos nessa interface não podem ser implementados.
3. A diferença entre classes abstratas e interfaces
1. Diferenças no nível gramatical
1) Classes abstratas podem fornecer detalhes de implementação dos métodos de membros, enquanto apenas métodos abstratos públicos podem existir na interface;
2) as variáveis de membros nas classes abstratas podem ser de vários tipos, enquanto as variáveis de membros na interface podem ser apenas do tipo final público;
3) A interface não pode conter blocos de código estático e métodos estáticos, enquanto classes abstratas podem ter blocos de código estáticos e métodos estáticos;
4) Uma classe pode herdar apenas uma classe abstrata, enquanto uma classe pode implementar várias interfaces.
2. Diferenças no nível do projeto
1) Classes abstratas são abstrações de coisas, ou seja, abstrações de classes, enquanto as interfaces são abstrações de comportamento. Uma classe abstrata abstraia toda a classe, incluindo propriedades e comportamentos, mas uma interface abstrava a parte da classe (comportamento). Para dar um exemplo simples, aviões e pássaros são coisas diferentes, mas todos têm uma coisa em comum, ou seja, todos voam. Então, ao projetar, a aeronave pode ser projetada como um avião e um caráter semelhante a um pássaro, mas a característica do vôo não pode ser projetada como uma classe. Portanto, é apenas uma característica comportamental, não uma descrição abstrata de um tipo de coisa. Nesse momento, o vôo pode ser projetado como uma interface, incluindo o método Fly () e, em seguida, o avião e o pássaro implementam a interface de mosca de acordo com suas próprias necessidades. Então, quanto a diferentes tipos de aeronaves, como caças, aeronaves civis, etc., ele pode herdar diretamente o avião. Também é semelhante aos pássaros. Diferentes tipos de pássaros podem herdar diretamente a classe de aves. A partir daqui, podemos ver que a herança é um relacionamento "sim ou não", enquanto a implementação da interface é um relacionamento "sim ou não". Se uma classe herda uma classe abstrata, a subclasse deve ser um tipo de classe abstrata, e a implementação da interface é um relacionamento que não existe, como se o pássaro pode voar (ou se tem as características do voo). Se puder voar, pode realizar essa interface. Se não puder voar, não perceberá essa interface.
2) Níveis de design diferentes, a classe abstrata é um design de modelo, como a classe pai de muitas subclasses. E a interface é um código de comportamento, é um design de radiação. O que é o design de modelo? O exemplo mais simples é que todos usaram os modelos no PPT. Se você usar o modelo A para projetar ppt b e ppt c, a parte comum do ppt b e ppt c é o modelo A. Se a parte pública precisar ser alterada, você só precisará alterar o modelo A e não há necessidade de re-mudar o ppt b e o design de Radiant, como um elevador equipado com algum tipo de alarme, uma vez que o alarme é atualizado, todos devem ser atualizados. Ou seja, para classes abstratas, se você precisar adicionar novos métodos, poderá adicionar diretamente implementações específicas à classe abstrata e as subclasses não podem ser alteradas; Mas para interfaces, não é possível. Se a interface for alterada, todas as classes que implementam essa interface devem ser alteradas de acordo.
Vamos ver o exemplo mais amplamente divulgado na Internet: Exemplos de portas e alarmes: as portas têm duas ações: Open () e Close (). Neste momento, podemos definir esse conceito abstrato por meio de classes e interfaces abstratas:
classe abstrata porta {public abstrate void aberto (); Resumo público Void Close ();}ou:
porta de interface {public abstrate void aberto (); Resumo público Void Close ();}Mas agora, se precisarmos da porta para ter a função de Alarm (), como implementá -la? As duas idéias a seguir são fornecidas:
1) Coloque todas as três funções na classe abstrata, mas, dessa maneira, todas as subclasses herdadas desta classe abstrata têm funções de alarme, mas algumas portas não têm necessariamente funções de alarme;
2) Coloque todas essas três funções na interface. As classes que precisam usar as funções de alarme precisam implementar o Open () e Close () nesta interface. Talvez essa classe não tenha as duas funções de Open () e Close (), como alarmes de incêndio.
A partir daqui, podemos ver a porta aberta (), close () e alarme () simplesmente pertencem a dois comportamentos em diferentes categorias. Open () e Close () pertencem às características de comportamento inerente do próprio portão, enquanto o alarme () pertence a comportamentos adicionais estendidos. Portanto, a melhor solução é projetar o alarme como uma interface, incluindo o comportamento do alarme () e a porta como uma classe abstrata separada, incluindo comportamentos abertos e próximos. Outro portão de alarme foi projetado para herdar a classe de porta e implementar a interface de alarme.
interface alram {void alarm ();} classe abstrata porta {void Open (); void close ();} classe alarmDoor estende a porta implementa o alarme {void oepn () {// ..} void close () {// ..} void alarm () {// ...}}O acima é uma compilação de interfaces Java e classes abstratas. Espero que possa ajudar amigos que aprendem a programação Java.