Maison > Java > javaDidacticiel > le corps du texte

La différence de syntaxe et de conception entre les classes abstraites et les interfaces en Java

php是最好的语言
Libérer: 2018-07-27 10:04:09
original
1853 Les gens l'ont consulté

Cet article explique la différence entre les classes abstraites et les interfaces en Java : 1. Différences au niveau de la syntaxe 2. Différences au niveau de la conception ;

1. Différences au niveau de la syntaxe

 1) Les classes abstraites peuvent fournir des détails d'implémentation des méthodes membres, tandis que seules les méthodes abstraites publiques peuvent exister dans les interfaces

 2) Abstraction ; Les variables membres d'une classe peuvent être de différents types, tandis que les variables membres d'une interface ne peuvent être que de type final statique public

3) Les interfaces ne peuvent pas contenir de blocs de code statiques et de méthodes statiques, tandis que les classes abstraites peuvent exister. blocs de code statiques et méthodes statiques ;

 4) Une classe ne peut hériter que d'une seule classe abstraite, mais une classe peut implémenter plusieurs interfaces.

2. Différences au niveau de la conception

1) Une classe abstraite est une abstraction d'une chose, c'est-à-dire une abstraction d'une classe, tandis qu'une interface est une abstraction d'un comportement. Une classe abstraite résume la classe entière, y compris les attributs et les comportements, mais une interface résume une partie de la classe (comportement). Pour donner un exemple simple, les avions et les oiseaux sont des types de choses différents, mais ils ont tous une chose en commun : ils peuvent voler. Ainsi, lors de la conception, vous pouvez concevoir un avion comme un avion, et un oiseau comme un oiseau, mais vous ne pouvez pas concevoir la caractéristique du vol en tant que classe, il ne s'agit donc que d'une caractéristique comportementale, pas d'une description abstraite d'un classe de choses. À l'heure actuelle, Flight peut être conçu comme une interface Fly, y compris la méthode fly(), puis Airplane et Bird implémentent l'interface Fly en fonction de leurs propres besoins. Ensuite, comme pour les différents types d'avions, tels que les avions de combat, les avions civils, etc., ils peuvent directement hériter de l'avion. Il en va de même pour les oiseaux. Différents types d'oiseaux peuvent directement hériter de la classe Bird. On peut voir à partir d'ici que l'héritage est une relation "est-ce que c'est", tandis que l'implémentation de l'interface est une relation "est-ce que c'est". Si une classe hérite d'une classe abstraite, la sous-classe doit être le type de la classe abstraite et l'implémentation de l'interface est liée à son existence ou non, par exemple, si un oiseau peut voler (ou s'il a la caractéristique de voler). , s'il peut voler Ensuite, vous pouvez implémenter cette interface. Si vous ne pouvez pas voler, vous ne pouvez pas implémenter cette interface.

2) Le niveau de conception est différent. La classe abstraite est la classe parent de nombreuses sous-classes, et c'est une conception de modèle. L'interface est une spécification comportementale et c'est une conception radiale. Qu’est-ce que la conception de modèles ? L'exemple le plus simple est que tout le monde a utilisé des modèles dans ppt. Si les ppt B et ppt C sont conçus à l'aide du modèle A, la partie commune des ppt B et ppt C est le modèle A. Si leurs parties communes doivent être modifiées, il leur suffit de le faire. être modifié. Le modèle A suffit, il n'est pas nécessaire de re-modifier le ppt B et le ppt C. Dans la conception radiale, par exemple, un ascenseur est équipé d'une sorte d'alarme. Une fois les alarmes mises à jour, toutes les alarmes doivent être mises à jour. C'est-à-dire que pour les classes abstraites, si vous avez besoin d'ajouter de nouvelles méthodes, vous pouvez ajouter des implémentations spécifiques directement à la classe abstraite, et les sous-classes n'ont pas besoin d'être modifiées, mais pour les interfaces, cela n'est pas possible ; est modifié, toutes les implémentations de cette interface seront affectées. Les classes doivent être modifiées en conséquence.

Regardons l'un des exemples les plus diffusés sur Internet : l'exemple de la porte et de l'alarme : la porte a deux actions : ouvrir() et fermer() A ce stade, nous pouvons définir cette abstraction via. classes et interfaces abstraites. Concept :

classe abstraite Porte {

public abstract void open();
public abstract void close();
Copier après la connexion
Copier après la connexion

}

Ou :

interface Porte {

public abstract void open();
public abstract void close();
Copier après la connexion
Copier après la connexion

}

Mais maintenant, si nous avons besoin que la porte ait la fonction alarm(), comment l'implémenter ? Deux idées sont proposées ci-dessous :

1) Mettez ces trois fonctions dans la classe abstraite, mais de cette façon toutes les sous-classes héritées de cette classe abstraite ont la fonction d'alarme, mais certaines portes n'en ont pas. fonction d'alarme ;

2) Mettez ces trois fonctions dans l'interface. La classe qui doit utiliser la fonction d'alarme doit implémenter open() et close() dans cette interface. Peut-être que cette classe n'a pas d'open. () et close() fonctionnent du tout, comme les alarmes incendie.

On peut voir d'ici que open(), close() et alarm() de Door appartiennent essentiellement à deux catégories de comportement différentes, open() et close() appartiennent aux caractéristiques comportementales inhérentes à la porte. lui-même, et alarm() est un comportement supplémentaire étendu. Par conséquent, la meilleure solution consiste à concevoir l’alarme comme une interface séparément, y compris le comportement alarm(), et à concevoir la porte comme une classe abstraite distincte, incluant les comportements d’ouverture et de fermeture. Concevez ensuite une porte d'alarme qui hérite de la classe Door et implémente l'interface Alarm.

interface Alram {

void alarm();
Copier après la connexion

}

classe abstraite Porte {

void open();
void close();
Copier après la connexion

}

classe AlarmDoor étend les outils de porte Alarme {

void oepn() {
  //....
}
void close() {
  //....
}
void alarm() {
  //....
}
Copier après la connexion

}

Articles connexes :

La différence entre les interfaces et les classes abstraites, la différence entre les classes abstraites d'interface

Interfaces et classes abstraites en java

Vidéos associées :

La différence entre l'interface et la classe abstraite - le dernier didacticiel vidéo complet Java

Ce qui précède est le contenu détaillé de. pour plus d'informations, suivez d'autres articles connexes sur le site Web de PHP en chinois!

Étiquettes associées:
source:php.cn
Déclaration de ce site Web
Le contenu de cet article est volontairement contribué par les internautes et les droits d'auteur appartiennent à l'auteur original. Ce site n'assume aucune responsabilité légale correspondante. Si vous trouvez un contenu suspecté de plagiat ou de contrefaçon, veuillez contacter admin@php.cn
Tutoriels populaires
Plus>
Derniers téléchargements
Plus>
effets Web
Code source du site Web
Matériel du site Web
Modèle frontal