Eines der drei Merkmale der objektorientierten Vererbung

1. Das Konzept der Vererbung

Wir haben zuvor gelernt: die drei Merkmale der objektorientierten: Einkapselung, Vererbung und Polymorphismus.

Vererbung ist die Voraussetzung für Polymorphismus. Wenn es keine Vererbung gibt, gibt es keinen Polymorphismus.

Das Hauptproblem, das durch Vererbung gelöst wird, ist: Extraktion von Gemeinsamkeiten .

Wenn Sie einige Klassen schreiben, gibt es viele Variablen oder Methoden, die gleich sind. Wenn Sie auf diese Weise schreiben, wird der Code sehr redundant. Daher können Sie diese allgemeinen Variablen und Methoden extrahieren und in eine Klasse einfügen und diese Klassen dann erben lassen Diese geerbten Klassen müssen diese Variablen und Methoden nicht mehr schreiben, sie können direkt verwendet werden, und diese geerbten Klassen können auch ihre eigenen eindeutigen Variablen und Methoden haben.

Die geerbte Klasse wird als übergeordnete Klasse bezeichnet, auch als Basisklasse und Superklasse.

Vererbte Klassen werden Unterklassen genannt, auch abgeleitete Klassen genannt.

Merkmale der Vererbungsbeziehung:

1. Unterklassen können vererbbaren Inhalt der übergeordneten Klasse haben.

2. Unterkategorien können auch neue Inhalte selbst übertragen lassen.

Hinweis: In der Vererbungsbeziehung ist "eine untergeordnete Klasse eine übergeordnete Klasse", dh eine untergeordnete Klasse kann als übergeordnete Klasse behandelt werden.

Zum Beispiel sind die Elternkategorie Angestellte und die Kinderkategorie Dozenten und Bischöfe. Dann ist "der Dozent ist ein Angestellter" gleichbedeutend mit der Aussage "das Kind ist ein Elternteil". In der Tat nicht mit einem Konzept in Konflikt stehen. In Bezug auf die Definition gehören alle Unterklassen zur übergeordneten Klasse, und inhaltlich enthält die Unterklasse die übergeordnete Klasse - das Gegenteil.

Definieren Sie das Format der übergeordneten Klasse: (eine allgemeine Klassendefinition)

Definieren Sie das Format der Unterklasse:

Der Name der Unterklasse der öffentlichen Klasse erweitert den Namen der übergeordneten Klasse {}

Beispiel: Elternklasse:

public class Employee {
        public void method(){
            System.out.println("方法执行!");
        }
}

Unterklasse:

public class Teacher extends Employee{

}

Rufen Sie die Unterklasse der Klasse auf:

public class Demo04Extends {
    public static void main(String[] args) {
        // 没写构造方法的话,编译器送一个
        Teacher teacher = new Teacher();
        teacher.method();
    }
}

Ergebnisse der:

Das heißt, obwohl ein Objekt der Lehrerklasse direkt instanziiert werden kann, um die Methode der übergeordneten Klasse aufzurufen.

 

2. Wenn in der Vererbungsbeziehung der übergeordneten und der untergeordneten Klasse die Elementvariable denselben Namen hat, gibt es beim Erstellen des Unterklassenobjekts zwei Möglichkeiten, darauf zuzugreifen:

1. Greifen Sie direkt über Unterklassenobjekte auf Mitgliedsvariablen zu:

    Wer sich links vom Gleichheitszeichen befindet, gibt demjenigen Vorrang, der verwendet wird, und wenn niemand da ist, schauen Sie nach .

public class Fu {
    int num = 10;
}
public class Zi extends Fu{
    int num = 20;
}
Fu fu = new Fu();
Zi zi = new Zi();

System.out.println(fu.num); // 10
System.out.println(zi.num); // 20

 

2. Indirekter Zugriff auf Mitgliedsvariablen über Mitgliedsmethoden:

    Wer zur Methode gehört, gibt demjenigen Vorrang, der verwendet wird, und wenn nicht, schauen Sie nach.

public class Fu {
    int num = 10;
    public void methodFu(){
        // 使用的是本类的,不会向下找
        System.out.println(num);
    }
}
public class Zi extends Fu{
     int num = 20;
    public void methodZi(){
        // 记住,优先用自己的,如果本类没有该变量,才往父类找
        // 即即使注释掉定义num那一行,下面这个输出也不会报错
        // 会去父类找到同名的
        System.out.println(num);
    }
}
public static void main(String[] args) {
    Fu fu = new Fu();
    Zi zi = new Zi();

    System.out.println(fu.num); // 10
    System.out.println(zi.num); // 20

    zi.methodZi(); // 20
    // 这个方法是在父类里定义的,所以这个num是父类的,不会向下找
    zi.methodFu(); // 10
}

 

Drei. Drei gleichnamige Variablen in der molekularen Methode

Lokale Variablen: direkt schreiben

Mitgliedsvariablen dieser Klasse: dieser Name der Mitgliedsvariablen

Die Mitgliedsvariable der übergeordneten Klasse: super. Name der Mitgliedsvariablen

 

public class Fu {
    int num = 10;
    public void methodFu(){
        // 使用的是本类的,不会向下找
        System.out.println(num);
    }
}
public class Zi extends Fu{
     int num = 20;
    public void method(){
        // 局部变量重名,直接写,出栈即毁
        int num = 30;
        System.out.println(num);  // 30,局部变量,优先离得近的
        System.out.println(this.num); // 20,成员变量
        System.out.println(super.num);  // 10,父类的成员变量
    }
}
public static void main(String[] args) {

    Zi zi = new Zi();
    zi.method();
}

5. Zugriffsmerkmale von Mitgliedsmethoden bei der Vererbung (achten Sie auf den gleichen Namen der Mitgliedsmethoden von Eltern- und Kinderklassen)

In der Vererbungsbeziehung der übergeordneten und untergeordneten Klassen gelten die Regeln für das Erstellen von Unterklassenobjekten und den Zugriff auf Elementmethoden:

    Wer auch immer das Objekt erstellt hat, wird dem Wasser Vorrang einräumen. Wenn nicht, suchen Sie es nach oben.

Vorsichtsmaßnahmen:

Unabhängig von den Mitgliedsvariablen und Mitgliedsmethoden wird, wenn keine vorhanden sind, die übergeordnete Klasse nachgeschlagen, und die untergeordnete Klasse wird niemals nach unten gesucht .

public class Fu2 {
    public void methodFu(){
        System.out.println("父类方法执行!");
    }
    public void method(){
        System.out.println("父类重名方法执行!");
    }
}
public class Zi2 extends Fu2{
    public void methodZi(){
        System.out.println("子类方法执行!");
    }
    public void method(){
        System.out.println("父类重名方法执行!");
    }
}
public static void main(String[] args) {
    Zi2 zi = new Zi2();
    zi.methodFu();
    zi.methodZi();
    zi.method();
}

Screenshot ausführen:

6. Override-Methode in der Vererbung (Override)

Konzept: In der Vererbungsbeziehung ist der Methodenname und die Parameterliste identisch . In diesem Fall wird dies als Umschreiben bezeichnet. Achten Sie darauf, ihn von der Methodenüberladung zu unterscheiden .

Überschreiben: Der Name der Methode ist derselbe, und die Parameterliste ist [auch derselbe], was auch als Überschreiben und Überschreiben bezeichnet wird.

Überladung: Der Name der Methode ist derselbe und die Parameterliste ist [nicht derselbe]

Die Merkmale der Methodenabdeckung und des Umschreibens: Wenn Sie ein Unterklassenobjekt erstellen, wird die Unterklassenmethode bevorzugt.

Vorsichtsmaßnahmen für die Methodenabdeckung und das Umschreiben:

1. Es muss sichergestellt sein, dass der Name der Methode zwischen der übergeordneten und der untergeordneten Klasse identisch ist und die Parameterliste ebenfalls identisch ist.

Um sicherzustellen, dass wir ein effektives Überschreiben durchführen, führen wir ein @Override (Annotation) ein, das vor der Methode geschrieben wird, um zu überprüfen, ob das Überschreiben gültig und korrekt ist. Wenn kein Fehler vorliegt, ist es wirksam überschreiben.

Selbst wenn dieser Kommentar nicht geschrieben wird, wird er effektiv überschrieben und neu geschrieben, solange er den Anforderungen entspricht. Er ist nur eine sichere Erkennungsmethode.

2. Der Rückgabewert der Unterklassenmethode muss kleiner oder gleich dem Rückgabewertbereich der übergeordneten Methode sein.

Wir erinnern uns an eine kleine Prämisse: Die String-Klasse hat ein übergeordnetes Klassenobjekt, das die gemeinsame übergeordnete Klasse (Basisklasse) aller Klassen ist.

Beispiel: Die übergeordneten und untergeordneten Klassen haben denselben Rückgabetyp und das richtige Format:

public class OverrideFu {
    public Object method(){
        Object object = new Object();
        return object;
    }
}
public class OverrideZi extends OverrideFu {
    // 没有报错,即有效重写
    @Override
    public Object method() {
        Object object = new Object();
        return object;
    }
}

Die Rückgabetypen der übergeordneten und untergeordneten Klassen sind nicht identisch. Der untergeordnete Klassentyp ist kleiner als die übergeordnete Klasse. Das richtige Format. Beachten Sie, dass der Typ, dessen Umfang beurteilt werden soll, auf den Referenztyp mit Vererbungsbeziehung beschränkt ist:

public class OverrideZi extends OverrideFu {
    // 没有报错,即有效重写
    @Override
    public String method() {
        String str = new String();
        return str;
    }
}

3. Die Berechtigung der Unterklassenmethode muss größer oder gleich dem Berechtigungsmodifikator der übergeordneten Methode sein .

Kleiner Erweiterungstipp: public> protected> (Standard)> private

Hinweis: (Standard) ist nicht das Standardschlüsselwort, aber schreiben Sie nichts und lassen Sie es leer.

 

7. Das Anwendungsszenario der Abdeckung und des Umschreibens von Vererbungsmethoden.

Entwurfsprinzip: Versuchen Sie, die verwendeten Klassen nicht zu ändern. Es wird empfohlen, eine neue Klasse zu definieren, um den allgemeinen Inhalt erneut zu lesen, zu verwenden und neuen Inhalt hinzuzufügen.

 

8. Zugriffseigenschaften der Bauweise bei der Vererbung

1. In der Unterklassenkonstruktionsmethode gibt es einen impliziten Standardaufruf "super ()" (wenn Sie ihn nicht schreiben, sendet der Compiler ihn). Es muss also die zuerst aufgerufene Superklassenkonstruktion und die Unterklassenkonstruktion sein das wird später ausgeführt.

public class Fu3 {
    public Fu3() {
        System.out.println("父类构造方法");
    }
}
public class Zi3 extends Fu3{
    public Zi3() {
        // Super(); //调用父类无参构造方法
        System.out.println("子类构造方法");
    }
}
public class Demo04Constructor {
    public static void main(String[] args) {
        // 不仅会用到子类的构造方法,也会用到父类的构造方法
        // 且父类的构造方法先调用。
        Zi3 zi = new Zi3();
    }
}

Screenshot ausführen:

2. Die Unterklassenstruktur verwendet Schlüsselwörter, um die Überklassenstruktur der Oberklasse aufzurufen .

Hinweis hier: Wenn eine Klasse eine parametrisierte Konstruktionsmethode überlädt, ohne eine parameterlose Konstruktionsmethode zu schreiben, gibt der Compiler keine parameterlose Konstruktionsmethode preis !

Wenn wir also die Konstruktionsmethode der übergeordneten Klasse so ändern, dass sie Parameter enthält, schreibt die Unterklasse nicht super (). Dann wird ein Fehler gemeldet, da es keine parameterfreie Konstruktionsmethode der übergeordneten Klasse gibt, die aufgerufen werden kann.

An diesem Punkt können wir die super. () -Methode verwenden , um die parametrisierte Konstruktionsmethode der Überladung der übergeordneten Klasse gemäß dem Format der parametrisierten Konstruktionsmethode der Überladung der übergeordneten Klasse aufzurufen . (Es ist optimistisch, diesen Satz farblich zu verstehen)

Zum Beispiel:

public class Fu3 {
    public Fu3(int num) {
        System.out.println("父类构造方法");
    }
}
public class Zi3 extends Fu3{
    public Zi3() {
        super(3); // 按照格式,写上int参数
        // super(); //调用父类无参构造方法
        System.out.println("子类构造方法");
    }
}

3. [Schlüsselpunkt] Der Aufruf der übergeordneten Klassenkonstruktion von super () muss die erste Anweisung der Unterklassenkonstruktionsmethode sein, und die Superkonstruktion kann für eine Unterklassenkonstruktion nicht mehrmals aufgerufen werden! ! !

Dieser Satz berücksichtigt zwei Punkte: super () muss in der Unterklassenkonstruktionsmethode geschrieben werden, es muss der erste Satz sein.

 

um zusammenzufassen:

Die Unterklasse muss die Konstruktionsmethode der übergeordneten Klasse aufrufen. Wenn sie nicht geschrieben ist, wird ein super () angegeben. Wenn es geschrieben wird, wird es mit dem angegebenen Super geschrieben. Es kann nur ein Super geben und muss das erste sein einer.

 

Ergänzung:

1. Java-Sprache ist Einzelvererbung.

Einzelvererbung: Es kann nur einen direkten Elternteil einer Klasse geben, und der Vater ist der einzige.

Wenn zwei übergeordnete Klassen geerbt werden und die beiden übergeordneten Klassen Methoden mit demselben Namen haben, ruft das Unterklassenobjekt diese Methode auf, und der Compiler kann nicht entscheiden, welche er auswählen soll, dh es tritt ein Kompilierungsfehler auf.

2. Die Java-Sprache kann auf mehreren Ebenen vererbt werden.

Die Kinderklasse (Kind) hat eine Elternklasse (Eltern) und die Elternklasse hat eine Elternklasse (Vater) und so weiter.

3. Das direkte übergeordnete Element einer Unterklasse ist eindeutig, ein übergeordnetes Element kann jedoch viele Unterklassen haben.

 

Ich denke du magst

Origin blog.csdn.net/wardo_l/article/details/113827856
Empfohlen
Rangfolge