编程知识 cdmana.com

Héritage orienté objet Java, réécriture des méthodes, associations et dépendances

No1Chapitre Aperçu et caractéristiques de l'héritage

1.1 La notion de succession

1.1.1 Aperçu de l'héritage is-a

L'héritage est une caractéristique centrale de l'orientation objet,Est une priorité d'apprentissage orientée objet.

L'héritage est un moyen important de réutiliser le Code,Est une relation entre une classe et une classe.

Du point de vue de la relation de conception entre les classes,Quand une sous - classe doit appartenir à l'une des classes de parents,Pour hériter..

Les parents extraient le contenu commun,Les sous - classes peuvent étendre de nouveaux attributs et comportements sur la base de la classe mère.

La Sous - classe possède toutes les propriétés et méthodes de la classe mère,Pas besoin de redéfinir.Et vous pouvez utiliser directement des membres de la classe parent non privés.
Mots clés extends

1.1CAS

Parent

package com.igeek.javase.ch02.extendss;

/** * @version 1.0 * @Description TODO * * Succession: is-a * 1.Mots clés extends * 2.L'héritage est essentiellement une pensée au niveau du design,L'intention est d'améliorer la réutilisabilité du Code * 3.Après que la Sous - classe hérite de la classe mère,La variable membre et la Sous - classe méthode membre de la classe parent ont toutes deux,Et les sous - classes peuvent également étendre de nouvelles propriétés et de nouvelles méthodes * 4.Objet parent créé,Vous pouvez utiliser les propriétés des membres et les méthodes des membres dans la classe parent,Mais vous ne pouvez pas utiliser les attributs et les méthodes d'extension de sous - classe * 5.JavaIl y a un héritage unique entre les classes */
public class Animal {
    

    private String name;
    private String color;
    private int age;

    public Animal() {
    
    }

    public Animal(String name, String color, int age) {
    
        this.name = name;
        this.color = color;
        this.age = age;
    }

    public String getName() {
    
        return name;
    }

    public void setName(String name) {
    
        this.name = name;
    }

    public String getColor() {
    
        return color;
    }

    public void setColor(String color) {
    
        this.color = color;
    }

    public int getAge() {
    
        return age;
    }

    public void setAge(int age) {
    
        this.age = age;
    }

    //Mange.
    public Animal eat(/*Animal a*/) /*throws Exception*/{
    
        System.out.println("Un seul."+color+name+"Je mange...");
        return null;
    }

}

Sous - catégories

package com.igeek.javase.ch02.extendss;

/** * @version 1.0 * @Description TODO */
public class Dog extends Animal{
    
    //
    private String player;

    public Dog() {
    
    }

    public Dog(String name, String color, int age, String player) {
    
        super(name, color, age);
        this.player = player;
    }

    public String getPlayer() {
    
        return player;
    }

    public void setPlayer(String player) {
    
        this.player = player;
    }

    //
    public void kanjia(){
    
        System.out.println("Un seul."+this.getAge()+"De"+this.getName()+" Dans la maison ...");
    }

}

1.2 La Sous - classe passe parget&set Méthode d'accès à la variable membre de la classe mère

​ Lorsque la variable membre de la classe parent utilise privateAprès modification, La Sous - classe n'a pas accès à la variable membre de la classe mère , Mais si la classe mère fournit publicDécoréget/setMéthodes, Alors la Sous - classe peut passer par get/setMéthodes, Accès normal aux variables membres de la classe mère .

No2Chapitre Méthode de réécriture et d'héritage des diagrammes de mémoire

2.1 Le concept et le format de la réécriture méthodologique

2.1.1 Aperçu de la méthode de réécriture

Lorsque la Sous - classe hérite du parent, A un membre de la classe parent et peut appeler directement la méthode non privée de la classe parent . Si la Sous - classe estime que la méthode fournie par la classe mère n'est pas assez puissante , Les sous - classes peuvent redéfinir les méthodes héritées des parents selon leur propre logique , Ce processus de redéfinition de la méthode parent s'appelle la réécriture de la méthode .

Après la réécriture de la méthode, La méthode de la classe mère n'est plus appelée lorsque la méthode est appelée , Et appeler la méthode réécrite de la Sous - classe .

package com.igeek.javase.ch02.extendss;

/** * @version 1.0 * @Description TODO * * Surcharge de la méthode Overload * 1.Se produit dans une classe * 2.Le nom de la méthode est le même * 3.La liste des paramètres est différente(Nombre de paramètres、Ordre des paramètres、Nombre de paramètres différents) * 4.Indépendamment de la valeur de retour * * Méthode de réécriture Override * 1. Se produit dans l'héritage ,Les enfants héritent des parents,Méthode de réécriture d'une sous - classe par rapport à une classe mère * 2.Le nom de la méthode est le même * 3. Les paramètres formels doivent être cohérents  * 4.Valeur de retour: Dans le cas d'un type de données de base, les valeurs retournées sont cohérentes ; *  Si le type de données de référence , Le type de valeur de retour de la Sous - classe ne peut pas être agrandi ,C'est possible.<=Type de valeur de retour de la classe mère Object>Animal>Cat Parent>Sous - catégories * 5.Modificateur d'accès: Les sous - classes ne peuvent pas être réduites  public>protected>(default)>private * 6.Lancer une exception: La Sous - classe lance une exception plus petite que la classe mère  Throwable>Exception>NullPointerException * * Attention!: * 1.@Override Une fois la méthode marquée , Vérifier si la méthode actuelle satisfait aux exigences de réécriture  * 2. Après que la Sous - classe a dépassé la méthode de la classe mère , L'exécution de l'appel exécute la logique après la réécriture de la Sous - classe  */
public class Cat extends Animal{
    

    public Cat() {
    
    }

    public Cat(String name, String color, int age) {
    
        super(name, color, age);
    }

    //Méthode de capture
    public void zhua(){
    
        System.out.println("Un seul."+this.getAge()+"Un an,Petit"+this.getName()+" J'attrape des poissons ...");
    }

    // Alt+Insert -> Override Ou Ctrl+O
    @Override
    public Cat eat(/*Animal a*/) /*throws NullPointerException*/{
    
        Cat cat = new Cat();
        // Logique d'appel par défaut pour la classe mère 
        //super.eat();
        System.out.println("Un seul."+getName()+"Je mange du poisson...");
        return cat;
    }
}

Test

package com.igeek.javase.ch02.extendss;

/** * @version 1.0 * @Description TODO */
public class Test {
    

    public static void main(String[] args) {
    
        Cat cat = new Cat("Chaton.","Coloration",2);
        cat.eat();  //Cat Outrepasser la méthode eat(), L'exécution se fait selon la logique de la Sous - classe 
        cat.zhua();

        System.out.println("------------------");

        Tiger tiger = new Tiger();
        tiger.setName("Tigre du Nord - est");
        tiger.setColor("Blanc");
        tiger.setAge(3);
        tiger.eat();
        tiger.hunt();

        System.out.println("------------------");

        Dog dog = new Dog("Husky","Gris",5," Color Steel ");
        dog.eat();
        dog.kanjia();

        System.out.println("------------------");

        Animal animal = new Animal("Animaux","Incolore",1);
        animal.eat();
        //animal.hunt();
        //animal.kanjia();
        //animal.zhua();
    }

}

Produits

 Un chaton mange du poisson ...
Un seul.2Un an, Le petit chat attrape le poisson ...
------------------
 Un tigre blanc du Nord - est mange ...
 Tigre du Nord - est en chasse ...
------------------
 Un husky gris mange ...
Un seul.5 Le Husky de ...
------------------
 Un animal incolore mange ...
  • Peut - on hériter ?
  •  1.Variable membre、Méthode d'adhésion  Peut hériter
    
  •  2.Propriété privée   Peut hériter
    
  •  3. Membres statiques    Non héréditaire, Les membres statiques sont partagés par toutes les instances 
    
  •  4.Méthode de construction     Non héréditaire
    
  • Si la méthode peut être réécrite ?
  •  1. Il n'y a pas de problème de réécriture des variables membres 
    
  •  2.Méthode de construction   Ne peut pas être réécrit
    
  •  3.Méthode statique   Ne peut pas être réécrit
    
  •  4.Méthode privée   Ne peut pas être réécrit
    

2.2 Séquence d'appel de la méthode de construction de l'enfant - parent après l'héritage

2.2.1 Aperçu de l'ordre d'appel de construction de la classe de parents d'enfants héréditaires

Chaque fois que vous créez un objet de sous - classe, Nous initialisons tous d'abord le contenu de la classe mère , Réinitialiser le contenu de sa sous - classe elle - même . Le but est que l'objet de sous - classe contient son espace de stockage parent correspondant , Peut contenir des membres de sa classe mère ,Si le membre parent n'est pasprivateModification,La Sous - classe est libre d'utiliser les membres de la classe mère.

Le Code est reflété dans l'appel de méthode de construction de la Sous - classe,Appelez d'abord la méthode de construction de la classe mère.

Insérer la description de l'image ici

No3Chapitre thisAvecsuper

3.1 thisAvecsuperAccès aux membres ordinaires

3.1.1 thisEtsuper Avis d'accès

Appeler un membre normal:

this.Variable membre Les variables membres qui peuvent accéder à ce type d'objets

super.Variable membre Variable membre qui peut accéder à la classe parent

this.Méthode d'adhésion() Méthodes d'adhésion pour accéder à ce type d'objets

super.Méthode d'adhésion() Accès aux méthodes des membres de la classe mère

Dans la méthode de la Sous - classe

​ Pour accéder aux membres de la Sous - classe elle - même this.

​ Accès aux membres de la classe parentsuper.

Principe de proximité:

​ Local > Membres de cette catégorie > Membre de la classe des parents

3.2 superAccéder à la méthode de construction de la classe mère

3.2.1 super Le format dans lequel la méthode de construction de la classe mère est appelée

Appeler la méthode de construction:

​ this(Autres paramètres) ..D'autres méthodes de construction de cette classe sont accessibles

​ super(Autres paramètres) Vous pouvez accéder à d'autres méthodes de construction de la classe mère

La Sous - classe par défaut appelle la méthode de construction de la classe mère :

​ Chaque méthode de construction d'une sous - classe a un défautsuper(),Appeler la construction des paramètres nuls de la classe mère.L'appel manuel à la construction de la classe mère écrasera la construction par défautsuper();

3.3 this Accès aux méthodes de construction des sous - classes

Utilisé dans la construction de sous - classes this() Ou this(Type de paramètre Valeur du paramètre…) La méthode peut appeler d'autres méthodes de construction dans cette classe . Mais en fin de compte, il s'agit d'appeler la méthode de construction de la classe mère , Terminer l'initialisation du membre parent .

No4Chapitre Liens et dépendances

4.1 Relations d'association

​ La connexion entre l'objet et l'objet .InJavaMoyenne, Le Code de la relation d'association est représenté par l'existence d'un type d'attribut d'une classe comme une autre .C'est - à - dire:“Oui.”La relation entre:”has-a”.

  • Relations d'association Pour augmenter le taux de réutilisation du Code
  • 1.Niveau de code: Une classe existe en tant que type d'attribut d'une autre classe 
    
  •  2.has-a   Oui.
    
  •  3.Un contre un.  、 Un à plusieursPhone[] phones、List<Phone> list
    
  •  4.Forte corrélation(Relations combinatoires)、Faible corrélation(Relations agrégées)
    
  •  5.Association unidirectionnelle、Association bidirectionnelle
    
package com.igeek.javase.ch02.has;

import java.util.Arrays;

/** * @version 1.0 * @Description Relations d'association */
public class ClassTest {
    

    public static void main(String[] args) {
    
        Student stu1 = new Student("Petit Rouge.",100);
        Student stu2 = new Student("Petit noir.",101);
        Student stu3 = new Student("Xiaobai.",102);
        Student[] stus = {
    stu1,stu2,stu3};

        Classes classes = new Classes("Java","Classe1",stus);
// classes.setStudents(stus);

        stu1.setClasses(classes);
        stu2.setClasses(classes);
        stu3.setClasses(classes);

        // Dans une association bidirectionnelle  , toString() Des questions qui vont s'appeler , Cause une erreur de débordement de pile  , Attention!
        System.out.println(classes);
        System.out.println("-----------"+classes.getName()+" Les informations pour les étudiants de ------------");
        for (Student student : classes.getStudents()) {
    
            System.out.println(student);
        }
    }

}
class Classes{
    
    private String label;
    private String name;

    //Un à plusieurs Forte corrélation Association bidirectionnelle
    private Student[] students = new Student[3];

    public Classes() {
    
    }

    public Classes(String label, String name) {
    
        this.label = label;
        this.name = name;
    }

    public Classes(String label, String name, Student[] students) {
    
        this.label = label;
        this.name = name;
        this.students = students;
    }

    /** * Accès * @return label */
    public String getLabel() {
    
        return label;
    }

    /** * Paramètres * @param label */
    public void setLabel(String label) {
    
        this.label = label;
    }

    /** * Accès * @return name */
    public String getName() {
    
        return name;
    }

    /** * Paramètres * @param name */
    public void setName(String name) {
    
        this.name = name;
    }

    /** * Accès * @return students */
    public Student[] getStudents() {
    
        return students;
    }

    /** * Paramètres * @param students */
    public void setStudents(Student[] students) {
    
        this.students = students;
    }

    /*public String toString() { return "Classes{label = " + label + ", name = " + name + ", students = " + Arrays.toString(students) + "}"; //StackOverflowError Débordement de pile }*/
    public String toString() {
    
        return "Classes{label = " + label + ", name = " + name + "}";
    }
}
class Student{
    
    private String name;
    private int num;

    //Un contre un. Faible corrélation Association bidirectionnelle
    private Classes classes;

    public Student() {
    
    }

    public Student(String name, int num) {
    
        this.name = name;
        this.num = num;
    }

    public Student(String name, int num, Classes classes) {
    
        this.name = name;
        this.num = num;
        this.classes = classes;
    }

    /** * Accès * @return name */
    public String getName() {
    
        return name;
    }

    /** * Paramètres * @param name */
    public void setName(String name) {
    
        this.name = name;
    }

    /** * Accès * @return num */
    public int getNum() {
    
        return num;
    }

    /** * Paramètres * @param num */
    public void setNum(int num) {
    
        this.num = num;
    }

    /** * Accès * @return classes */
    public Classes getClasses() {
    
        return classes;
    }

    /** * Paramètres * @param classes */
    public void setClasses(Classes classes) {
    
        this.classes = classes;
    }

    public String toString() {
    
        return "Student{name = " + name + ", num = " + num + ", classes = " + classes + "}";
    }
}

4.2 Dépendance

Dépendance(use-a):Se réfère à une classeAUtilisé dans une autre classeB. Caractéristiques de la dépendance : Cette relation est fortuite 、Temporaire、Très faible,Mais la classeBLes changements dans la classe affectentA.

  • Dépendance Pour la réutilisation du Code
  •   1.Niveau de code   Une classe existe en tant que type de paramètre de méthode d'une autre classe 
    
  •   2.use-a  Avec
    
  •   3.Temporaire,Contingency
    
public class Person {
    

    private String name;

    // La façon de travailler  CatégorieAUtilisé dans une autre classeB
    public void work(Bus bus){
    
        System.out.println(this.name+"À bord."+bus.getName()+"Aller travailler");
    }

    public Person() {
    
    }

    public Person(String name) {
    
        this.name = name;
    }

    /** * Accès * @return name */
    public String getName() {
    
        return name;
    }

    /** * Paramètres * @param name */
    public void setName(String name) {
    
        this.name = name;
    }

    public String toString() {
    
        return "Person{name = " + name + "}";
    }
}

版权声明
本文为[Vers le Haut]所创,转载请带上原文链接,感谢
https://cdmana.com/2022/01/202201080601056414.html

Scroll to Top