Une note sur les différences entre les interfaces et les classes abstraites en Java

Une description pour vous convaincre de la différence entre une interface et une classe abstraite.

introduction

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.

Interfaces et classes abstraites

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. "

  1. Chaque classe a "largeur" et "hauteur" dans les champs.
  2. Il a une méthode "show_width_and_height ()" qui affiche "width" et "height".
  3. Il a une méthode "getArea ()" pour trouver la zone.

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. "

Javaのクラス階層.png

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."

finalement

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

Une note sur les différences entre les interfaces et les classes abstraites en Java
Comprenez la différence entre les classes abstraites et les interfaces!
Pensez aux différences entre les fonctions et les méthodes (en Java)
Différences dans l'écriture des classes Java, C # et Javascript
Ayons une idée approximative des différences entre protocoles, classes et structures!
Résumer les différences entre l'écriture C # et Java
Différences entre les classes et les instances dans Ruby
Remarque sur l'initialisation des champs dans le didacticiel Java
[JAVA] Quelle est la différence entre interface et abstract? ?? ??
Classes et instances Java comprises dans la figure
À propos de la classe abstraite Java
Méthodes et classes abstraites Java
[Java] Remarque sur la différence entre le jugement d'équivalence et le jugement d'égalité lors de la comparaison de classes String
Différences dans la gestion des chaînes entre Java et Perl
Différences entre Java "débutant" et Kotlin
[JAVA] Différence entre abstrait et interface
Différences entre Java et .NET Framework
Différence entre final et immuable en Java
Une note sur la classe Utils libGDX
[Java] Différences entre les variables d'instance et les variables de classe
[Note] Coopération entre Java et DB (basique)
Cours et méthodes abstraits d'histoire d'apprentissage JAVA
[Détails] Maîtrisons les classes abstraites et les interfaces! !!
Différence entre int et Integer en Java
Spécifiez l'ordre dans lequel les fichiers de configuration et les classes sont chargés dans Java
L'histoire de l'oubli de fermer un fichier en Java et de l'échec
Interpréter la relation entre les méthodes Java et les arguments en formules biochimiques
Comprendre la différence entre int et Integer et BigInteger en java et float et double
[Java] Comprendre la différence entre List et Set
Concernant les modificateurs transitoires et la sérialisation en Java
[Java] Différence entre equals et == dans une chaîne de caractères qui est un type de référence
À propos de l'idée des classes anonymes en Java
Une histoire sur le JDK à l'ère de Java 11
Efficacité de Java 3rd Edition Chapitre 4 Classes et interfaces
Mesurer la taille d'un dossier avec Java
Différence entre next () et nextLine () dans Java Scanner
[Comprendre] Différence entre le hachage et le tableau dans Ruby
Une note quand vous voulez Tuple en Java
Différence entre Java, C # et JavaScript (comment trouver le degré d'obésité)
Compilez et exécutez Java sur la ligne de commande
Comment trouver la distance et l'angle entre deux points sur un plan
Distinguer les nombres positifs et négatifs en Java
Un mémo sur le flux de Rails et Vue
Télécharger et télécharger des notes en java sur S3
Organisez la différence de confort d'écriture entre l'expression lambda Java et l'expression lambda Kotlin.
[Java] [javaSliver] L'interface et les classes abstraites sont compliquées, je vais donc les résumer.
Voyons les différences entre les sous-chaînes Java et les sous-chaînes C #, et comment les porter.
Comprenez en 3 minutes! Une explication très approximative de la différence entre session et cookie
Écrivez ABNF en Java et transmettez l'adresse e-mail
Veuillez noter la division (division) de java kotlin Int et Int
Ecrire une classe en Kotlin et l'appeler en Java
Calculer la différence entre les nombres dans un tableau Ruby
[Java] Différence entre statique final et final dans les variables membres
Différences entre Fetch Type LAZY et EAGER dans Hibernate
Comment convertir A en A et A en A en utilisant le produit logique et la somme en Java
Utilisation correcte de la classe abstraite et de l'interface en Java
Différences de code lors de l'utilisation du système de longueur en Java