Java – Polymorphismus; abstrakte Klasse; Schnittstelle

1. Abstrakte Klasse

1. Abstrakte Klassendefinition

Fügen Sie das Schlüsselwort abstract vor class hinzu

public abstract class AbstractClass

2. Abstrakte Klassen können nicht instanziiert und Objekte nicht erstellt werden (abstrakte Klassen werden verwendet, um von Unterklassen geerbt zu werden)

3. final und abstract können nicht zusammen verwendet werden, diese beiden Schlüsselwörter sind entgegengesetzt

4. Die Unterklasse einer abstrakten Klasse kann eine abstrakte Klasse sein, sie kann auch eine nicht-abstrakte Klasse sein

5. Obwohl die abstrakte Klasse nicht instanziiert werden kann, hat die abstrakte Klasse eine Konstruktionsmethode, die von Unterklassen verwendet wird

6. Es darf keine abstrakten Methoden in abstrakten Klassen geben, abstrakte Methoden müssen in abstrakten Klassen vorkommen

7. Abstrakte Methodendefinition

public abstract void doSome();

8. Eine nicht-abstrakte Klasse, die eine abstrakte Klasse erbt, muss die abstrakten Methoden in der abstrakten Klasse überschreiben/umschreiben/implementieren

Nicht alle Methoden ohne Methodenkörper in Java sind abstrakte Methoden. Es gibt viele Methoden in der Object-Klasse, die keinen Methodenrumpf haben und mit „;“ enden, aber keine davon sind abstrakte Methoden, wie zum Beispiel:

public native int hashCode();

Die unterste Schicht der hashCode()-Methode ruft das in C++ geschriebene Dynamic Link Library-Programm auf

Es gibt kein: abstract in der vorherigen Modifikatorliste, es gibt ein natives, was bedeutet, dass das native JVM-Programm aufgerufen wird

Daraus ist ersichtlich, dass abstrakte Klassen für die Vererbung existieren.Wenn Sie eine abstrakte Klasse definieren, aber nicht erben, dann ist dies gleichbedeutend damit, diese abstrakte Klasse umsonst zu erstellen, weil Sie sie nicht verwenden können, um irgendetwas zu tun. Wenn eine bestimmte Methode einer Elternklasse in der Elternklasse keine Bedeutung hat, muss sie entsprechend den tatsächlichen Bedürfnissen der Unterklasse anders implementiert werden 

Eine Klasse, die abstrakte Methoden enthält, wird abstrakte Klasse genannt, aber das bedeutet nicht, dass es in einer abstrakten Klasse nur abstrakte Methoden geben kann, sondern sie kann genauso wie normale Klassen Mitgliedsvariablen und gewöhnliche Mitgliedsmethoden haben.

Es gibt drei Hauptunterschiede zwischen abstrakten Klassen und gewöhnlichen Klassen :

1. Die abstrakte Methode muss öffentlich oder geschützt sein (denn wenn sie privat ist, kann sie nicht von Unterklassen geerbt werden und Unterklassen können die Methode nicht implementieren), und der Standardwert ist öffentlich

2. Abstrakte Klassen können nicht zum Erstellen von Objekten verwendet werden

3. Wenn eine Klasse von einer abstrakten Klasse erbt, muss die Unterklasse die abstrakte Methode der Elternklasse implementieren . Wenn die Unterklasse die abstrakte Methode der Elternklasse nicht implementiert, muss die Unterklasse ebenfalls als abstrakte Klasse definiert werden

In anderer Hinsicht unterscheiden sich abstrakte Klassen nicht von gewöhnlichen Klassen

2. Schnittstelle

(1) Grundlegende Grammatik der Schnittstelle

Interface , Englisch heißt  Interface , in der Softwareentwicklung bezieht sich Interface im Allgemeinen auf eine Methode oder Funktion, die von anderen aufgerufen wird, es ist eine Abstraktion von Verhalten

In Java sieht die Form der Definition einer Schnittstelle wie folgt aus:

[修饰符列表] interface 接口名{}

wie:

public interface TestInterface {
    public void doSome();
}

1. Schnittstelle ist ein "Referenzdatentyp"

2. Die Schnittstelle ist völlig abstrakt

3. Die Schnittstelle unterstützt Mehrfachvererbung

4. Es gibt nur Konstanten + abstrakte Methoden in der Schnittstelle

5. Alle Elemente in der Schnittstelle werden öffentlich modifiziert

6. Die öffentliche Zusammenfassung der abstrakten Methode in der Schnittstelle kann weggelassen werden

7. Das öffentliche statische Finale der Konstante in der Schnittstelle kann weggelassen werden

8. Methoden in Schnittstellen können keine Methodenrümpfe haben

9. Für eine nicht abstrakte Klasse müssen beim Implementieren einer Schnittstelle alle Methoden in der Schnittstelle implementiert werden

10. Eine Klasse kann mehrere Schnittstellen implementieren

11. Erweitern und Implementieren können nebeneinander bestehen, zuerst erweitern, später implementieren

12. Mit Schnittstellen können Sie Polymorphie verwenden (Referenzen von Elterntypen verweisen auf Untertypobjekte)

(2) Die Rolle von Schnittstellen in der Entwicklung

Die Rolle von Schnittstellen in der Entwicklung ähnelt der Rolle von Polymorphismus in der Entwicklung        

多态:面向抽象编程,不要面向具体编程。降低程序的耦合度。提高程序的扩展力
            /*
            public class Master{
                public void feed(Dog d){}
                public void feed(Cat c){}
                //假设又要养其它的宠物,那么这个时候需要再加1个方法。(需要修改代码了)
                //这样扩展力太差了,违背了OCP原则(对扩展开放,对修改关闭。)
            }
            */

            public class Master{
                public void feed(Animal a){
                    // 面向Animal父类编程,父类是比子类更抽象的。
                    //所以我们叫做面向抽象编程,不要面向具体编程。
                    //这样程序的扩展力就强。
                }
            }

„Entkopplung“, abstrakt orientierte Programmierung kann verstanden werden als: schnittstellenorientierte Programmierung

Die schnittstellenorientierte Programmierung kann den Kopplungsgrad des Programms reduzieren und die Skalierbarkeit des Programms verbessern, sie entspricht dem OCP-Entwicklungsprinzip

Die Verwendung von Schnittstellen ist untrennbar mit dem polymorphen Mechanismus verbunden (Schnittstelle + Polymorphismus kann eine reduzierte Kopplung erreichen), Schnittstellen können entkoppelt werden

Jede Schnittstelle hat einen Aufrufer und einen Implementierer; die Schnittstelle kann den Aufrufer und den Implementierer entkoppeln

Der Aufrufer ruft die Schnittstelle auf, der Implementierer schreibt die Implementierung für die Schnittstelle

Schnittstellen können Variablen und Methoden enthalten

Notiz:

(1) Variablen in der Schnittstelle werden implizit als öffentliche statische Endvariablen bezeichnet (und können nur öffentliche statische Endvariablen sein, und ein Kompilierungsfehler wird gemeldet, wenn sie mit privat geändert werden).

(2) Die Methode in der Schnittstelle wird implizit als öffentliche abstrakte Methode bezeichnet , und es kann nur eine öffentliche abstrakte Methode sein (modifiziert mit anderen Schlüsselwörtern wie private, protected, static, final usw., wird eine Kompilierung melden Fehler), und die Schnittstelle in Alle Methoden kann keine konkreten Implementierungen haben ( Methoden in Schnittstellen müssen abstrakte Methoden sein )

Interface ist ein extrem abstrakter Typ, der "abstrakter" als abstrakte Klasse ist und im Allgemeinen keine Variablen in Interfaces definiert

Eine Klasse, die einem bestimmten Satz von Schnittstellen entspricht, muss das Schlüsselwort implements verwenden , das spezifische Format ist wie folgt:

public class TestInterfaceImpl implements TestInterface{
    @Override
    public void doSome() {
        // TODO Auto-generated method stub
    }
}

Bei der Entwicklung großer Projekte wird das Projekt im Allgemeinen nacheinander in Module unterteilt, und es werden Schnittstellen zwischen Modulen verwendet, um eine Verbindung herzustellen (Reduzierung des Kopplungsgrads).

(3) Der Unterschied zwischen abstrakter Klasse und Schnittstelle

1. Grammatischer Unterschied

1. Abstrakte Klassen sind semi-abstrakt, Schnittstellen sind vollständig abstrakt

2. Es gibt Konstruktoren in abstrakten Klassen, es gibt keine Konstruktoren in Interfaces

3. Zwischen Schnittstellen wird Mehrfachvererbung unterstützt, zwischen Klassen nur Einfachvererbung

4. Eine Klasse kann mehrere Interfaces gleichzeitig implementieren, eine abstrakte Klasse kann nur eine Klasse erben (Einfachvererbung)

5. In der Schnittstelle sind nur Konstanten und abstrakte Methoden erlaubt

6. Schnittstellen können keine statischen Codeblöcke und statischen Methoden enthalten, während abstrakte Klassen statische Codeblöcke und statische Methoden haben können

2. Designunterschied

(1) Eine abstrakte Klasse ist eine Abstraktion einer Sache, d. h. eine Abstraktion einer Klasse, während eine Schnittstelle eine Abstraktion des Verhaltens ist. Eine abstrakte Klasse abstrahiert die gesamte Klasse als Ganzes, einschließlich Attributen und Verhaltensweisen, aber eine Schnittstelle abstrahiert die Teile (Verhaltensweisen) der Klasse.

Zum Beispiel sind Flugzeuge und Vögel verschiedene Dinge, aber sie alle haben eines gemeinsam, nämlich dass sie fliegen können. Beim Entwerfen können Sie dann ein Flugzeug als flugzeugähnlich und einen Vogel als vogelähnlich entwerfen, aber Sie können das Flugmerkmal nicht als Klasse entwerfen, daher ist es nur ein Verhaltensmerkmal, keine abstrakte Beschreibung von a Klasse der Dinge. Zu diesem Zeitpunkt kann der Flug als Interface Fly entworfen werden, einschließlich der Methode fly( ), und dann implementieren Airplane und Bird das Fly-Interface nach ihren eigenen Bedürfnissen. Dann reicht es für verschiedene Flugzeugtypen, wie Kampfjets und zivile Flugzeuge, aus, direkt von Airplane zu erben.Dasselbe gilt für Vögel.Verschiedene Vogeltypen können direkt von der Bird-Klasse erben.

Hieraus ist ersichtlich, dass die Vererbung eine „ob oder nicht“-Beziehung ist, während die Schnittstellenimplementierung eine „ob oder nicht“-Beziehung ist. Wenn eine Klasse eine bestimmte abstrakte Klasse erbt, muss die Unterklasse der Typ der abstrakten Klasse sein, und die Schnittstellenimplementierung hängt davon ab, ob dies der Fall ist oder nicht, z. B. ob der Vogel fliegen kann (oder ob er die Eigenschaft des Fliegens hat). , kann fliegen Dann können Sie diese Schnittstelle implementieren, wenn Sie nicht fliegen können, implementieren Sie diese Schnittstelle nicht.

(2) Die Entwurfsebene ist unterschiedlich.Als Elternklasse vieler Unterklassen ist die abstrakte Klasse ein Schablonenentwurf. Während die Schnittstelle eine Verhaltensspezifikation ist, handelt es sich um ein radiales Design.

Zum Beispiel: Vorlage in ppt, wenn Vorlage A zum Entwerfen von ppt B und ppt C verwendet wird, ist der gemeinsame Teil von ppt B und ppt C Vorlage A, wenn ihre gemeinsamen Teile geändert werden müssen, muss nur Vorlage A geändert werden, Es besteht keine Notwendigkeit, erneut Änderungen an ppt B und ppt C vorzunehmen.

Und das radiale Design, zum Beispiel, ein bestimmter Aufzug ist mit einer Art Alarm ausgestattet, sobald der Alarm aktualisiert werden soll, müssen alle aktualisiert werden. Das heißt, wenn Sie bei einer abstrakten Klasse eine neue Methode hinzufügen müssen, können Sie direkt eine bestimmte Implementierung in der abstrakten Klasse hinzufügen, und die Unterklasse muss nicht geändert werden, aber für die Schnittstelle, wenn die Schnittstelle geändert werden muss geändert, müssen alle Implementierungen der Schnittstellenklassen entsprechend angepasst werden.

Parameter abstrakte Klasse Schnittstelle
Die Implementierung der Standardmethode Es kann eine zu implementierende Standardmethode geben Völlig abstrakt, es gibt überhaupt keine Implementierung der Methode
Methode zu realisieren

Die Unterklasse verwendet das Schlüsselwort extend, um die abstrakte Klasse zu erben, wenn die Unterklasse

Wenn es sich nicht um eine abstrakte Klasse handelt, muss sie alle Abstraktionen in der übergeordneten abstrakten Klasse implementieren

Wie Methoden können nicht abstrakte Methoden in der übergeordneten Klasse überschrieben werden oder nicht

Die Unterklasse verwendet Implements, um die Schnittstelle zu implementieren, und muss alle Methoden in der Schnittstelle implementieren
Konstrukteur Abstrakte Klassen können Konstruktoren haben (Konstruktoren können nicht mit Abstract geändert werden) Schnittstellen können keine Konstruktoren haben
Unterschiede zu normalen Java-Klassen Normale Java-Klassen können instanziiert werden, abstrakte Klassen können nicht instanziiert werden, siehe Kontext für weitere Unterschiede Schnittstellen und normale Java-Klassen sind unterschiedliche Typen
Zugriffsmodifikator  Abstrakte Methoden können mit public, protected, default modifiziert werden Die Schnittstelle ist standardmäßig öffentlich und kann nicht mit anderen Modifikatoren geändert werden
Hauptmethode Es kann eine Hauptmethode in einer abstrakten Klasse geben, die ausgeführt werden kann In einer Schnittstelle kann es keine Hauptmethode geben, daher kann sie nicht ausgeführt werden
Mehrfachvererbung Eine abstrakte Klasse kann eine Klasse erben und mehrere Schnittstellen implementieren Eine Schnittstelle kann nur eine oder mehrere Schnittstellen erben
Geschwindigkeit Abstrakte Klassen sind schneller als Interfaces Die Schnittstelle ist etwas langsamer, da sie ihre in der Klasse implementierten Methoden finden muss
neue Methode hinzufügen Wenn Sie einer abstrakten Klasse eine neue nicht-abstrakte Methode hinzufügen, können Sie diese direkt hinzufügen, da die nicht-abstrakte Methode nicht in der Unterklasse implementiert werden muss.Wenn es sich um eine abstrakte Methode handelt, müssen Sie den Code von ändern die Unterklasse und implementieren Sie diese Methode Solange der Schnittstelle eine Methode hinzugefügt wird, ändert sich die Klasse, die sie implementiert, um die neu hinzugefügte Methode zu implementieren

(4) Anwendungsszenarien abstrakter Klassen und Schnittstellen

1. Wenn Sie einige Methoden haben und möchten, dass einige davon Standardimplementierungen haben, verwenden Sie abstrakte Klassen

2. Wenn Sie Mehrfachvererbung erreichen wollen, müssen Sie Schnittstellen verwenden. Da Java keine Mehrfachvererbung unterstützt, können Unterklassen nicht mehrere Klassen erben, aber mehrere Schnittstellen implementieren. Sie können also Schnittstellen verwenden, um (Polymorphismus) zu lösen

3. Wenn sich die Grundfunktionen ständig ändern, müssen Sie abstrakte Klassen verwenden. Wenn Sie die grundlegende Funktionalität ständig ändern und die Schnittstelle verwenden, müssen Sie alle Klassen ändern, die die Schnittstelle implementieren

Drittens Polymorphismus

Objektorientierte Programmierung hat drei Eigenschaften: Kapselung, Vererbung, Polymorphismus

1. Die Kapselung verbirgt den internen Implementierungsmechanismus der Klasse, der die interne Struktur der Klasse ändern kann, ohne die Verwendung zu beeinträchtigen, und schützt auch die Daten. Seine internen Details sind vor der Außenwelt verborgen, und nur seine Zugriffsmethoden sind der Außenwelt ausgesetzt.

2. Vererbung besteht darin, den Elternklassencode wiederzuverwenden. Besteht zwischen zwei Klassen eine IS-A-Beziehung, kann auf Vererbung zurückgegriffen werden. Gleichzeitig ebnete die Vererbung auch den Weg für die Verwirklichung der Polymorphie.

3. Polymorphismus bedeutet, dass der spezifische Typ, auf den die im Programm definierte Referenzvariable zeigt, und der durch die Referenzvariable ausgegebene Methodenaufruf nicht während der Programmierung bestimmt werden, sondern während der Ausführung des Programms bestimmt werden, dh eine Referenzvariable wird zeigen auf Das Instanzobjekt welcher Klasse und die implementierte Methode in welcher Klasse der von der Referenzvariable abgesetzte Methodenaufruf während des Programmablaufs ermittelt werden muss.

Da die spezifische Klasse während des Programmablaufs bestimmt wird, kann auf diese Weise ohne Änderung des Quellprogrammcodes die Referenzvariable an verschiedene Klassenimplementierungen gebunden werden, was bewirkt, dass sich die spezifische Methode, die durch die Referenz aufgerufen wird, entsprechend ändert , nicht ändern Der Programmcode kann die spezifische Codegrenze ändern, wenn das Programm ausgeführt wird, sodass das Programm mehrere Ausführungszustände auswählen kann, was Polymorphismus ist.

1. Die Prämisse des Polymorphismus:

(1) Es muss ein Erb- oder Verwertungsverhältnis bestehen

(2) Es muss eine Methode umgeschrieben werden

(3) Es muss eine Elternklassenreferenz geben, die auf das Unterklassenobjekt zeigt

2. Definition und Verwendungsformat von Polymorphismus

定义格式:
    父类类型 变量名 = new 子类类型();

Zum Beispiel: Tier a=neue Katze();

Tier

public class Animal {
    public void eat() {
        System.out.println("动物吃东西");
    }
}

Die Cat-Klasse erbt die Animal-Klasse

//有继承关系
public class Cat extends Animal{
    //有方法的重写
    @Override
    public void eat() {
        System.out.println("猫吃鱼");
    }

    //子类特有方法
    public void catchMouse(){
        System.out.println("猫抓老鼠");
    }
}

Hundeklasse, geerbt von der Tierklasse

//有继承关系
public class Dog extends Animal{
    //有方法的重写
    @Override
    public void eat() {
        System.out.println("狗啃骨头");
    }

    //子类特有方法
    public void careHome(){
        System.out.println("狗看家护院");
    }
}

Testcode:

public class AnimalDemo {
    public static void main(String[] args) {

        //编译时是Animal类,运行时内存是Cat类
        Animal a = new Cat();//向上转型;父类引用指向子类对象
        a.eat();//输出 “猫吃鱼”
        //a.catchMouse(); //编译错误,a是Animal类,没有catchMouse()方法

        //Exception in thread "main" java.lang.ClassCastException: multiple.Animal cannot be cast to multiple.Cat 
        //此时内存中a是Cat,猫不能强转为狗
        Dog d = (Dog)a;//向下转型;父类引用转为子类对象,转型的是父类引用所指向的那个子类对象
        d.eat();
    }
}

Mitgliedszugriffsmerkmale im Polymorphismus

1. Mitgliedsvariablen:

Kompilieren, um die übergeordnete Klasse anzuzeigen, ausführen, um die übergeordnete Klasse anzuzeigen

2. Member-Methode:

Kompilieren Sie, um die übergeordnete Klasse anzuzeigen, und führen Sie sie aus, um die Unterklasse anzuzeigen

Beziehungen zwischen Typen und Typen:

ist eine (Vererbung), hat eine (Assoziation), wie eine (Implementierung)

1. ist ein:
                Katze ist ein Tier (eine Katze ist ein Tier)
                kann den Ausdruck erfüllen, ist ein "Erbverhältnis"
                A erweitert B

2. hat eine:
                ich habe eine Katze (ich habe eine Katze)
                kann den Ausdruck erfüllen, hat eine Beziehung "Assoziationsbeziehung"
                Beziehung existiert normalerweise in Form von "Attribut".
                A{                     B b;                 } 3. wie a:                 der Ausdruck, der die wie eine Beziehung erfüllen kann "Implementierungsbeziehung"                 Die Realisierungsbeziehung ist normalerweise: Die Klasse implementiert die Schnittstelle.                 A implementiert B





Viertens das letzte Schlüsselwort

1. Endgültig modifizierte Klassen können nicht vererbt werden

2. Die Methode der endgültigen Änderung kann nicht überschrieben werden

3. Einer durch final modifizierten Variablen kann nur einmal ein Wert zugewiesen werden

4. Sobald die letzte modifizierte Referenz auf ein Objekt zeigt, kann sie nicht länger auf andere Objekte zeigen, aber die Attributdaten innerhalb des Objekts, auf das durch die Referenz gezeigt wird, können modifiziert werden

public class FinalTest2 {
    public static void main(String[] args) {

        Person p1 = new Person();
        //可以赋值
        p1.name = "张三111";
        System.out.println(p1.name);

        final Person p2 = new Person();
        p2.name = "李四";
        System.out.println(p2.name);

        p2.name = "张三";
        System.out.println(p2.name);

        //不能编译通过;java: 无法为最终变量p2分配值
        //p2 采用 final 修饰,主要限制了 p2 指向堆区中的地址不能修改(也就是p2 只能指向一个对象)
        //p2 指向的对象的属性是可以修改的
        //p2 = new Person();
    }
}

class Person {
    String name;
}
张三111
李四
张三

5. Durch final geänderte Instanzvariablen müssen manuell initialisiert werden, und der Standardwert des Systems kann nicht verwendet werden

6. Final modifizierte Instanzvariablen werden im Allgemeinen in Verbindung mit statischen Variablen verwendet und als Konstanten bezeichnet

public static final double PI = 3.1415926;

7. Final modifizierte Variablen müssen explizit initialisiert werden

// final 修饰的变量必须显示初始化
// Variable 'number' might not have been initialized
//private static final Long number;


int i;
// 局部变量必须初始化,如果不使用可以不初始化
// Variable 'i' might not have been initialized
//System.out.println(i);

8. Die Bauweise kann von final nicht geändert werden 

Ich denke du magst

Origin blog.csdn.net/MinggeQingchun/article/details/120733179
Empfohlen
Rangfolge