Une description pour vous convaincre de la différence entre une interface et une classe abstraite.
Pourquoi y en a-t-il deux? J'ai remarqué que de nombreuses personnes se posent les mêmes questions que lors des sessions d'étude. J'ai été convaincu par moi-même une fois, mais j'ai oublié, alors j'ai décidé de me souvenir. Notez également ici pour pouvoir vous y référer à tout moment si vous l'oubliez. Je me suis posé à plusieurs reprises des questions et donné des explications convaincantes, je voudrais donc les enregistrer dans un format conversationnel ici. Le débutant Java A pose les questions les unes après les autres et l'intermédiaire Java B y répond.
C'est peut-être une explication qui peut éliminer la maladie des débutants qui ont étudié la grammaire Java. De plus, le contenu de la conversation est une version autodidacte des phrases écrites dans les livres suivants. C'était très facile à comprendre et précis pour moi qui a commencé à programmer Android sans étudier correctement Java.
[Modern Java for Android Engineers](https://www.amazon.co.jp/Android%E3%82%A8%E3%83%B3%E3%82%B8%E3%83%8B%E3% 82% A2% E3% 81% AE% E3% 81% 9F% E3% 82% 81% E3% 81% AE% E3% 83% A2% E3% 83% 80% E3% 83% B3Java-% E5% B1 % B1% E7% 94% B0-% E7% A5% A5% E5% AF% 9B / dp / 477415878X / ref = sr_1_1? Ie = UTF8 & qid = 1502351641 & sr = 8-1 & mots-clés =% E3% 83% A2% E3% 83 % 80% E3% 83% B3java)
Certains des mots que M. B prononce incluent des interprétations uniques telles que «c'est ce que c'est», alors j'apprécierais que vous puissiez signaler des erreurs.
R: "Comment utiliser correctement l'interface et la classe abstraite?" B: "En gros, pourquoi ne pas utiliser une interface qui permet l'héritage multiple?" R: "Alors quel est le but de la classe abstraite? Elle ne peut pas être héritée plusieurs fois comme une interface, et les avantages ne sont pas clairs." B: "L'avantage des classes abstraites par rapport aux interfaces est qu'elles ont des implémentations concrètes, alors que les interfaces ne peuvent avoir que des constantes et des méthodes abstraites ([Modern Java for Android Engineers]( https://www.amazon.co.jp/Android%E3%82%A8%E3%83%B3%E3%82%B8%E3%83%8B%E3%82%A2%E3%81%AE% E3% 81% 9F% E3% 82% 81% E3% 81% AE% E3% 83% A2% E3% 83% 80% E3% 83% B3Java-% E5% B1% B1% E7% 94% B0-% E7% A5% A5% E5% AF% 9B / dp / 477415878X / ref = sr_1_1? Ie = UTF8 & qid = 1502351641 & sr = 8-1 & mots-clés =% E3% 83% A2% E3% 83% 80% E3% 83% B3java) Il dit que cela peut aussi avoir des classes / interfaces statiques imbriquées, mais je ne le mentionnerai pas ici), les classes abstraites peuvent aussi avoir des méthodes régulières (ci-après dénommées «méthodes normales») et des constructeurs. " A: "Fum Fum" B: "Ainsi, par exemple, si vous voulez que toutes les classes subordonnées aient les deux méthodes avec le même contenu de traitement et les méthodes que vous souhaitez modifier individuellement le contenu de traitement, il est préférable d'utiliser une classe abstraite plutôt qu'une interface. Le traitement est exactement le même. Si c'est une méthode, si vous l'écrivez dans une méthode normale dans une classe abstraite, ses classes enfants peuvent l'utiliser telle quelle. " R: "Je veux que vous me donniez un exemple concret." B: "Par exemple, disons que" Figure "est la classe parente et" Triangle "et" Rectangle "sont les classes enfants. On suppose que ces classes ont les champs et méthodes suivants. "
B: "Le code ressemble à ceci:"
Figure.java
public abstract class Figure {
//champ
protected double width;
protected double height;
//constructeur
public Figure(double width, double height) {
this.width = width;
this.height = height;
}
//Largeur et hauteur de sortie
public String show_width_and_height() {
return "La largeur est" + String.valueOf(width) + "、"
+ "La hauteur est" + String.valueOf(height);
}
//Zone de sortie (méthode abstraite)
pubic abstract double getArea();
}
Triangle.java
public class Triangle extends Figure {
//constructeur
public Triangle(int width, int height) {
super(width, height);
}
//Sortie de l'aire du triangle
@override
pubic double getArea() {
return this.width * this.height / 2;
}
}
Rectangle.java
public class Rectangle extends Figure {
//constructeur
public Rectangle(double width, double height) {
super(width, height);
}
//Sortie de l'aire du quadrilatère
@override
public double getArea(){
return this.width * this.height;
}
}
B: "La figure est écrite comme une classe abstraite. La largeur et la hauteur sont définies comme des champs, show_width_and_height () est une méthode normale et getArea () est une méthode abstraite. Alors que les méthodes d'interface ne sont que des méthodes abstraites, Rappelez-vous que vous pouvez généralement avoir des méthodes dans une classe abstraite. Width, height, show_width_and_height () sont hérités de la figure en Triangle, Rectangle, vous n'avez donc pas à les réécrire dans la classe enfant. Les implémentations spécifiques ne peuvent pas être transmises aux classes. " R: "Je vois!" B: "Alors getArea (), mais j'utilise ceci comme une méthode abstraite, car la zone est calculée différemment pour les triangles et les carrés, donc j'essaye de laisser le contenu à chaque classe enfant." R: "Mais n'est-il pas possible de faire de la méthode de recherche de la zone une méthode normale avec un contenu factice et de la remplacer? Plus précisément, getArea () n'est pas écrit dans la figure, mais chaque individu Vous pouvez aussi écrire dans une classe enfant, non? " B: "C'est possible, mais il n'y a aucune garantie que la personne qui écrit le code implémentera getArea () dans la classe enfant. Lorsque vous voulez garantir cela, la classe abstraite fonctionne bien. Peut forcer ses propres méthodes abstraites à être remplacées par des classes subordonnées, ce qui permet d'éviter les omissions d'implémentation. Eh bien, à cet égard, c'est la même chose que l'interface. " R: "Vous insistez sur le fait que cette fonctionnalité est essentielle!" B: "L'autre différence est que les classes abstraites appartiennent à une partie de la hiérarchie des classes, tandis que les interfaces sont indépendantes. Ce n'est pas précis, mais une esquisse approximative de la hiérarchie des classes dans le monde Java. Je l'ai écrit, alors vérifiez-le. "
B: "Lors de la définition d'une classe, même si vous ne spécifiez pas la source d'héritage, vous hériterez implicitement de la classe Object en haut de la hiérarchie de classes. Celle-ci sera ajoutée à la hiérarchie de classes existante. Cela signifie que l'interface est indépendante de la hiérarchie des classes et peut être librement associée à n'importe quelle classe. De plus, la classe abstraite AbstractMap est une classe enfant de la classe Object et le parent de classes concrètes telles que HashMap et TreeMap. C'est une classe. C'est une classe abstraite intégrée dans une hiérarchie de classes. Vous ne pouvez pas faire cela car l'interface n'est pas une classe. " R: "C'est complètement différent si vous l'expliquez."
Je pense que j'ai acquis beaucoup de compréhension sur la façon dont les deux sont différents, mais je suis sûr qu'il reste encore beaucoup à dire sur la façon de les utiliser correctement. Apparemment [Introduction aux modèles de conception appris dans le langage Java amélioré et révisé](https://www.amazon.co.jp/%E5%A2%97%E8%A3%9C%E6%94%B9%E8%A8%82] % E7% 89% 88-Java% E8% A8% 80% E8% AA% 9E% E3% 81% A7% E5% AD% A6% E3% 81% B6% E3% 83% 87% E3% 82% B6 % E3% 82% A4% E3% 83% B3% E3% 83% 91% E3% 82% BF% E3% 83% BC% E3% 83% B3% E5% 85% A5% E9% 96% 80-% E7% B5% 90% E5% 9F% 8E-% E6% B5% A9-ebook / dp / B00I8ATHGW / ref = sr_1_1? Ie = UTF8 & qid = 1502444166 & sr = 8-1 & mots-clés =% E3% 83% 87% E3% 82% B6% E3% 82% A4% E3% 83% B3% E3% 83% 91% E3% 82% BF% E3% 83% BC% E3% 83% B3) Il semble que cela soit écrit en détail. En fait, je l'ai acheté avant, mais je ne sais pas beaucoup lire. Je peux l'ajouter s'il y a quelque chose de nouveau.
Recommended Posts