Objektorientierte JavaSE-Klassen, Vererbung und Polymorphismus
Verstehen Sie den Unterricht?
1 In Java ist eine Klassendatei eine Codedatei mit dem Suffix .java. In jeder Klassendatei darf höchstens eine öffentliche Klasse vorkommen , Der Name der Klassendatei muss mit dem Namen der öffentlichen Klasse identisch sein. Wenn public nicht vorhanden ist, kann der Name der Klassendatei ein beliebiger Name sein.
2 Wenn innerhalb der Klasse für Mitgliedsvariablen keine explizite Zuweisungsinitialisierung beim Definieren erfolgt, stellt Java sicher, dass jede Mitgliedsvariable der Klasse ordnungsgemäß initialisiert wird
1) Für Variablen grundlegender Datentypen wie char, short, byte, int, long, float, double usw. werden standardmäßig auf 0 initialisiert (boolesche Variablen werden standardmäßig auf false initialisiert)
2) Für Referenztypenvariablen werden standardmäßig auf Null initialisiert.3 Wenn der Konstruktor nicht explizit definiert ist, erstellt der Compiler automatisch einen Konstruktor ohne Argumente. Beachten Sie, dass alle Konstruktoren standardmäßig statisch sind.
-
4 Die Reihenfolge, in der Klassen Objekte instanziieren
1) Wenn das Programm ausgeführt wird, muss zunächst ein Objekt einer bestimmten Klasse generiert werden Diese Klasse wird geladen. Wenn sie nicht geladen ist, wird zuerst die Klasse geladen und dann das Objekt generiert. Wenn sie geladen wurde, wird das Objekt direkt generiert.
2) Während des Ladevorgangs der Klasse werden die statischen Mitgliedsvariablen der Klasse initialisiert. Wenn in der Klasse ein statischer Anweisungsblock vorhanden ist, wird außerdem der statische Anweisungsblock ausgeführt. Die Ausführungsreihenfolge statischer Mitgliedsvariablen und statischer Anweisungsblöcke stimmt mit der Reihenfolge im Code überein.
3) In Java werden Klassen bei Bedarf geladen. Diese Klasse wird nur dann geladen, wenn sie benötigt wird, und zwar nur einmal.
Sehen Sie sich zum Verständnis das folgende Beispiel an:public class Bread { static { System.out.println("Bread is loaded"); } public Bread() { System.out.println("bread"); } public static void main(String[] args) throws ClassNotFoundException { Bread bread1 = new Bread(); Bread bread2 = new Bread(); } }
Nach dem Login kopierenFühren Sie diesen Code aus und Sie werden feststellen, dass „Brot ist geladen“ nur einmal gedruckt wird.
4) Beim Generieren eines Objekts werden zuerst die Mitgliedsvariablen des Objekts initialisiert und dann der Konstruktor ausgeführt. Dies bedeutet, dass die Variablen in der Klasse initialisiert werden, bevor eine Methode (einschließlich des Konstruktors) aufgerufen wird, selbst wenn die Variablen zwischen Methodendefinitionen verstreut sind.public class Test { public static void main(String[] args) { new Meal(); } } class Meal { public Meal() { System.out.println("meal"); } Bread bread = new Bread(); } class Bread { public Bread() { System.out.println("bread"); } }
Nach dem Login kopierenDas Ausgabeergebnis ist:
bread meal
Nach dem Login kopieren
Verstehen Sie Vererbung?
-
1 Vererbung
1) Vererbung ist ein unverzichtbarer Bestandteil aller OOP-Sprachen. Das Schlüsselwort „extends“ wird in Java verwendet, um die Vererbungsbeziehung auszudrücken. Beim Erstellen einer Klasse wird diese immer geerbt. Wenn die zu erbende Klasse nicht explizit angegeben wird, wird sie immer implizit von der Stammklasse Object geerbt. Zum Beispiel der folgende Code:class Person { public Person() { } } class Man extends Person { public Man() { } }
Nach dem Login kopieren2) Die Klasse Man erbt von der Klasse Person. In diesem Fall wird die Klasse Person als übergeordnete Klasse (Basisklasse) und die Klasse Man bezeichnet die Unterklasse (abgeleitete Klasse). Wenn zwischen zwei Klassen eine Vererbungsbeziehung besteht, erbt die Unterklasse automatisch die Methoden und Variablen der übergeordneten Klasse, und die Methoden und Variablen der übergeordneten Klasse können in der Unterklasse aufgerufen werden.
3) In Java ist nur Einzelvererbung zulässig, das heißt, eine Klasse kann höchstens explizit von einer übergeordneten Klasse erben. Eine Klasse kann jedoch von mehreren Klassen geerbt werden, was bedeutet, dass eine Klasse mehrere Unterklassen haben kann. 2 Unterklasse erbt die Attribute der übergeordneten Klasse
Wenn die Unterklasse eine bestimmte Klasse erbt, kann sie die Mitgliedsvariablen in der übergeordneten Klasse verwenden, erbt diese jedoch nicht vollständig übergeordnete Klasse. Alle Mitgliedsvariablen. Die spezifischen Prinzipien lauten wie folgt:
1) Die öffentlichen und geschützten Mitgliedsvariablen der übergeordneten Klasse können nicht vererbt werden
2) Für die Paketzugriffsberechtigungs-Mitgliedsvariablen der übergeordneten Klasse, wenn sich die übergeordnete Klasse im selben Paket befindet, kann die untergeordnete Klasse erben; andernfalls kann die untergeordnete Klasse nicht erben; Wenn in der Unterklasse eine Mitgliedsvariable mit demselben Namen erscheint, tritt das Phänomen
ausblenden auf, d. h. die Mitgliedsvariablen der Unterklasse blockieren die Mitgliedsvariablen der übergeordneten Klasse mit dem gleichen Namen. Wenn Sie in einer Unterklasse auf eine gleichnamige Mitgliedsvariable in der übergeordneten Klasse zugreifen möchten, müssen Sie das Schlüsselwort super als Referenz verwenden.- 3 Die Unterklasse erbt die Methoden der übergeordneten Klasse
Ebenso erbt die Unterklasse nicht alle Methoden der übergeordneten Klasse vollständig.
1) Kann die öffentlichen und geschützten Mitgliedsmethoden der übergeordneten Klasse erben;
2) Für die Paketzugriffsmethoden der übergeordneten Klasse, wenn die Unterklasse und die Die übergeordnete Klasse befindet sich im selben Paket, die Unterklasse kann erben; andernfalls kann die Unterklasse nicht erben Unterklasse heißt
überschreibt , das heißt, die Mitgliedsmethoden der Unterklasse überschreiben die gleichnamigen Mitgliedsmethoden der übergeordneten Klasse. Wenn Sie in einer Unterklasse auf eine gleichnamige Mitgliedsmethode in der übergeordneten Klasse zugreifen möchten, müssen Sie das Schlüsselwort super als Referenz verwenden. 4 Hinweis - Verstecken und Verdecken sind unterschiedlich.
Das Ausblenden gilt für Mitgliedsvariablen und statische Methoden,
während das Überschreiben für gewöhnliche Methoden gilt. 5 构造器
1)子类是不能够继承父类的构造器,但是要注意的是,如果父类的构造器都是带有参数的,则必须在子类的构造器中显示地通过super关键字调用父类的构造器并配以适当的参数列表。
2)如果父类有无参构造器,则在子类的构造器中用super关键字调用父类构造器不是必须的,如果没有使用super关键字,系统会自动调用父类的无参构造器。6 super主要有两种用法
1)super.成员变量/super.成员方法;
2)super(parameter1,parameter2....)
第一种用法主要用来在子类中调用父类的同名成员变量或者方法;
第二种主要用在子类的构造器中显示地调用父类的构造器
要注意的是,如果是用在子类构造器中,则必须是子类构造器的第一个语句。
你了解多态吗?
1 子类必是父类,所以父类型的引用可以指向子类型的对象。
-
2 动态绑定方法的多种不同版本(即非编译时绑定,而是晚绑定或者动态绑定)
Parent p = new Child(); p.eat();
Nach dem Login kopieren此时Parent和Child中必须都有eat()方法;
即多态进行动态绑定的前提条件是继承,子类必须继承父类的方法,才能使用父类的引用进行方法调用。 3 父类引用能向下转换成子类引用的前提是父类引用指向子类的对象。
4 向下转换后的引用,就可以调用子类特有的方法了。
5 多态的好处,定义方法时,出入参可以申明为父类的类型,传参时,可以传递子类的对象。这样在方法不改变的前提下,就可以扩展子类的种类,添加新的逻辑。
-
6 覆盖方法才会进行动态绑定,而隐藏是不会发生动态绑定的。
1)举例如下public class Test { public static void main(String[] args) { Shape shape = new Circle(); System.out.println(shape.name); // 成员变量(隐藏) shape.printName(); // 静态方法(隐藏) shape.printType(); // 非静态方法(覆盖) } } class Shape { public String name = "shape"; public Shape(){ System.out.println("shape constructor"); } public void printType() { System.out.println("this is shape"); } public static void printName() { System.out.println("shape"); } } class Circle extends Shape { public String name = "circle"; public Circle() { System.out.println("circle constructor"); } public void printType() { System.out.println("this is circle"); } public static void printName() { System.out.println("circle"); } }
Nach dem Login kopieren2)输出结果:
shape constructor circle constructor shape shape this is circle
Nach dem Login kopieren3)原因分析
覆盖受RTTI(Runtime type identification)约束的,而隐藏却不受该约束。也就是说只有覆盖方法才会进行动态绑定,而隐藏是不会发生动态绑定的。在Java中,除了static方法和final方法,其他所有的方法都是动态绑定。因此,就会出现上面的输出结果。
Das obige ist der detaillierte Inhalt vonObjektorientierte JavaSE-Klassen, Vererbung und Polymorphismus. Für weitere Informationen folgen Sie bitte anderen verwandten Artikeln auf der PHP chinesischen Website!

Heiße KI -Werkzeuge

Undresser.AI Undress
KI-gestützte App zum Erstellen realistischer Aktfotos

AI Clothes Remover
Online-KI-Tool zum Entfernen von Kleidung aus Fotos.

Undress AI Tool
Ausziehbilder kostenlos

Clothoff.io
KI-Kleiderentferner

AI Hentai Generator
Erstellen Sie kostenlos Ai Hentai.

Heißer Artikel

Heiße Werkzeuge

Notepad++7.3.1
Einfach zu bedienender und kostenloser Code-Editor

SublimeText3 chinesische Version
Chinesische Version, sehr einfach zu bedienen

Senden Sie Studio 13.0.1
Leistungsstarke integrierte PHP-Entwicklungsumgebung

Dreamweaver CS6
Visuelle Webentwicklungstools

SublimeText3 Mac-Version
Codebearbeitungssoftware auf Gottesniveau (SublimeText3)

Heiße Themen



Verwenden Sie bei der Funktionsvererbung „Basisklassenzeiger“ und „abgeleitete Klassenzeiger“, um den Vererbungsmechanismus zu verstehen: Wenn der Basisklassenzeiger auf das abgeleitete Klassenobjekt zeigt, wird eine Aufwärtstransformation durchgeführt und nur auf die Mitglieder der Basisklasse zugegriffen. Wenn ein abgeleiteter Klassenzeiger auf ein Basisklassenobjekt zeigt, wird eine Abwärtsumwandlung durchgeführt (unsicher) und muss mit Vorsicht verwendet werden.

Virtuelle Basisklassen optimieren den Speicheraufwand für virtuelle Tabellen, indem sie die Vererbung von mehreren Basisklassen ermöglichen, ohne zusätzliche virtuelle Tabellen zu erstellen. Im optimierten Code verfügt die Formbasisklasse nicht mehr über eine virtuelle Funktionstabelle, und die Kreis- und Rechteckklassen teilen sich dieselbe virtuelle Funktionstabelle, wodurch der Speicherverbrauch reduziert wird.

Vererbung und Polymorphismus wirken sich auf die Kopplung von Klassen aus: Vererbung erhöht die Kopplung, da die abgeleitete Klasse von der Basisklasse abhängt. Polymorphismus reduziert die Kopplung, da Objekte über virtuelle Funktionen und Basisklassenzeiger konsistent auf Nachrichten reagieren können. Zu den Best Practices gehören der sparsame Umgang mit der Vererbung, die Definition öffentlicher Schnittstellen, das Vermeiden des Hinzufügens von Datenelementen zu Basisklassen und die Entkopplung von Klassen durch Abhängigkeitsinjektion. Ein praktisches Beispiel, das zeigt, wie Polymorphismus und Abhängigkeitsinjektion verwendet werden, um die Kopplung in einer Bankkontoanwendung zu reduzieren.

Tipps zum Debuggen von Vererbungsfehlern: Stellen Sie sicher, dass die Vererbungsbeziehungen korrekt sind. Verwenden Sie den Debugger, um den Code schrittweise durchzugehen und Variablenwerte zu untersuchen. Stellen Sie sicher, dass Sie den virtuellen Modifikator richtig verwenden. Untersuchen Sie das Problem der Vererbungsdiamanten, das durch versteckte Vererbung verursacht wird. Suchen Sie nach nicht implementierten rein virtuellen Funktionen in abstrakten Klassen.

Detaillierte Erläuterung der C++-Funktionsvererbung: Beherrschen Sie die Beziehung zwischen „is-a“ und „has-a“ Was ist Funktionsvererbung? Funktionsvererbung ist eine Technik in C++, die in einer abgeleiteten Klasse definierte Methoden mit in einer Basisklasse definierten Methoden verknüpft. Es ermöglicht abgeleiteten Klassen, auf Methoden der Basisklasse zuzugreifen und diese zu überschreiben, wodurch die Funktionalität der Basisklasse erweitert wird. „Ist-ein“- und „Hat-ein“-Beziehungen Bei der Funktionsvererbung bedeutet die „Ist-ein“-Beziehung, dass die abgeleitete Klasse ein Untertyp der Basisklasse ist, d. h. die abgeleitete Klasse „erbt“ die Merkmale und das Verhalten von die Basisklasse. Die „has-a“-Beziehung bedeutet, dass die abgeleitete Klasse einen Verweis oder Zeiger auf das Basisklassenobjekt enthält, d. h. die abgeleitete Klasse „besitzt“ das Basisklassenobjekt. SyntaxDas Folgende ist die Syntax für die Implementierung der Funktionsvererbung: classDerivedClass:pu

Was ist objektorientierte Programmierung? Objektorientierte Programmierung (OOP) ist ein Programmierparadigma, das reale Entitäten in Klassen abstrahiert und Objekte zur Darstellung dieser Entitäten verwendet. Klassen definieren die Eigenschaften und das Verhalten von Objekten und Objekte instanziieren Klassen. Der Hauptvorteil von OOP besteht darin, dass Code einfacher zu verstehen, zu warten und wiederzuverwenden ist. Grundkonzepte von OOP Zu den Hauptkonzepten von OOP gehören Klassen, Objekte, Eigenschaften und Methoden. Eine Klasse ist der Bauplan eines Objekts, der seine Eigenschaften und sein Verhalten definiert. Ein Objekt ist eine Instanz einer Klasse und verfügt über alle Eigenschaften und Verhaltensweisen der Klasse. Eigenschaften sind Merkmale eines Objekts, das Daten speichern kann. Methoden sind Funktionen eines Objekts, die mit den Daten des Objekts arbeiten können. Vorteile von OOP Zu den Hauptvorteilen von OOP gehören: Wiederverwendbarkeit: OOP kann den Code erweitern

Die Vererbung von C++-Funktionen sollte in den folgenden Situationen nicht verwendet werden: Wenn eine abgeleitete Klasse eine andere Implementierung erfordert, sollte eine neue Funktion mit einer anderen Implementierung erstellt werden. Wenn eine abgeleitete Klasse keine Funktion erfordert, sollte sie als leere Klasse deklariert werden oder private, nicht implementierte Mitgliedsfunktionen der Basisklasse verwenden, um die Funktionsvererbung zu deaktivieren. Wenn Funktionen keine Vererbung erfordern, sollten andere Mechanismen (z. B. Vorlagen) verwendet werden, um eine Wiederverwendung des Codes zu erreichen.

Schnittstelle: Eine implementierte Vertragsschnittstelle definiert eine Reihe von Methodensignaturen in Java, stellt jedoch keine konkrete Implementierung bereit. Es fungiert als Vertrag, der Klassen, die die Schnittstelle implementieren, dazu zwingt, ihre angegebenen Methoden zu implementieren. Die Methoden in der Schnittstelle sind abstrakte Methoden und haben keinen Methodenkörper. Codebeispiel: publicinterfaceAnimal{voideat();voidsleep();} Abstrakte Klasse: Teilweise implementierter Entwurf Eine abstrakte Klasse ist eine übergeordnete Klasse, die eine teilweise Implementierung bereitstellt, die von ihren Unterklassen geerbt werden kann. Im Gegensatz zu Schnittstellen können abstrakte Klassen konkrete Implementierungen und abstrakte Methoden enthalten. Abstrakte Methoden werden mit dem Schlüsselwort abstract deklariert und müssen von Unterklassen überschrieben werden. Codebeispiel: publicabstractcla
