Diferenças:
(1) As classes abstratas precisam ser herdadas e apenas herança única; as interfaces precisam ser implementadas e várias implementações são possíveis.
(2) Métodos abstratos podem ser definidos em classes abstratas, e métodos não abstratos também podem ser definidos. As subclasses podem usar métodos não abstratos diretamente nelas depois de herdar classes abstratas; as interfaces só podem definir métodos abstratos, que devem ser implementados por subclasses .
(3) A herança de classes abstratas é definir o conteúdo comum básico do sistema; a realização de interfaces é definir as funções adicionais do sistema.
1. Aula abstrata
Métodos abstratos devem ser usadosresumoModificação de palavra-chave. Se uma classe contém métodos abstratos, ela é chamada de classe abstrata, e a classe abstrata deve ser modificada com a palavra-chave abstract antes da classe. Como não há método de realização concreto na classe abstrata, você não pode usar a classe abstrata para criar um objeto.
Os seguintes pontos devem ser observados sobre as classes abstratas:
• Os métodos abstratos não podem ser incluídos em classes não abstratas. Se a subclasse da classe pai abstrata não pode implementar todos os métodos abstratos, a subclasse também deve ser definida como abstrata. em outras palavras,Na subclasse não abstrata que a classe abstrata estende, todos os métodos abstratos devem ser implementados.Observe também que os métodos abstratos não são estáticos.
• Classes abstratas não podem ser inicializadas usando o novo operador. Porém, ainda é possível definir seu método de construção, que é chamado no método de construção de suas subclasses. Por exemplo, o método de construção da classe CeometricObject é chamado na classe Circle e na classe Recfange.
• A classe que contém métodos abstratos deve ser abstrata. No entanto, você pode definir uma classe abstrata que não contém métodos abstratos . Nesse caso, você não pode usar o novo operador para criar uma instância dessa classe. Esta classe é usada para definir a classe base da nova subclasse.
• As subcategorias podemReescreverO método da classe pai e defini-lo como abstrato. Isso é raro, mas é útil quando a implementação do método da classe pai se torna inválida na classe filha. Nesse caso, a subclasse deve ser definida como abstrata;
• Mesmo se a classe pai da subclasse for concreta, a subclasse pode ser abstrata. Por exemplo, a classe Object é concreta, mas suas subclasses, como GeometricObject, podem ser abstratas.
• Você não pode usar o operador new para criar uma instância de uma classe abstrata, mas a classe abstrata pode ser usada como um
tipo de dados . Portanto, a seguinte declaração é correta para criar uma matriz cujos elementos são do tipo GeometricObject:
GeometricObject [] objects = new GeometricObject [10];
Em seguida, você pode criar uma instância de GeometricObject e atribuir seu valor de referência à matriz, conforme mostrado abaixo:
objetos [0] = novo Círculo ();
[Nota 1] Quais palavras-chave não podem coexistir com palavras-chave abstratas?
private no (as subclasses não podem ser substituídas)
static no (a chamada do nome da classe não tem conteúdo)
final no (o método final não pode ser reescrito)
**Compreensão pessoal: ** Uma classe abstrata é equivalente a uma classe formal, um template de uma classe, e os métodos abstratos dentro são alguns métodos formais, que precisam ser instanciados quando usados. capaz de passarParâmetros formais e reaisPara se assemelhar à memória, mas existem diferenças.
public class Demo {
public static void main(String[] args) {
//非抽象类的子类来创建实例对象
door D=new door();
D.open();
D.close();
//不可以直接用new创建实例,下列写法是错误的
BigDoor d=new BigDoor();
//抽象类作为数据类型定义数组
BigDoor[] d=new BigDoor[10];
d[0]=new door();
d[0].open();
d[0].close();
}
}
abstract class BigDoor{
public abstract void open();
public abstract void close();
}
class door extends BigDoor{
public void open() {
System.out.println("open");
}
public void close() {
System.out.println("close");
}
}
2. Interface
Quando todos os métodos em uma classe abstrata são métodos abstratos, podemos definir e expressar a classe abstrata em outra forma, que é a interface.
A interface pode conter variáveis e métodos. Mas note que as variáveis na interface serão designadas implicitamente como variáveis finais públicas estáticas (e apenas variáveis finais estáticas públicas, modificadas com private reportarão erros de compilação), e o método será implicitamente designado como métodos abstratos públicos E só pode ser um método abstrato público (modificações com outras palavras-chave, como privado, protegido, estático, final, etc. reportarão erros de compilação) e todos os métodos na interfaceNão pode ter uma realização concreta, Ou seja, os métodos na interfaceTodos eles devem ser métodos abstratos.
A partir daqui, você pode ver vagamente a diferença entre uma interface e uma classe abstrata.Uma interface é um tipo extremamente abstrato, que é mais "abstrato" do que uma classe abstrata e, em geral, nenhuma variável é definida na interface.
Pontos a serem observados:
1.
(1) Há um relacionamento de herança entre classes e um relacionamento de implementação entre classes e interfaces.
(2) A interface não pode ser instanciada. Somente após a subclasse que implementa a interface e reescreve todos os métodos abstratos na interface, a subclasse pode ser instanciada. Caso contrário, esta subclasse é uma classe abstrata.
2. Como usar a interface? ---- Realização, use a palavra-chave implements
(1) As classes Java não suportam herança múltipla, mas uma classe pode implementar várias interfaces.
(2) Uma classe pode implementar várias interfaces enquanto herda outra classe.
Descrição: quando a
subclasse implementa o método da interface, o métodoModificado para público, Porque quando a interface é definida, o método é público por padrão, mesmo que não seja explicitamente escrito.
**Compreensão pessoal:** Uma interface é um método específico. Se você precisar implementar um método obrigatório, poderá implementá-lo por meio da interface. Pode ser alcançado através da interfaceHerança múltipla。
abstract class Big{
public abstract void open();
public abstract void close();
}
interface action{
public void opendoor();
public void closedoor();
}
class door extends Big{
public void open() {
System.out.println("open");
}
public void close() {
System.out.println("close");
}
}
class good implements action{
public void opendoor() {
System.out.println("Open doors");
}
public void closedoor() {
System.out.println("Close doors");
}
}
class D extends door implements action{
public void closedoor() {
System.out.println("close door");
}
public void opendoor() {
System.out.println("open door");
}
}
public class Demo {
public static void main(String[] args) {
door d=new door();
d.close();
//实现接口
good g=new good();
g.closedoor();
g.opendoor();
//抽象类+接口
D ans=new D();
ans.close();
ans.open();
ans.closedoor();
ans.opendoor();
}
}