Ich bin ein Neuling für Java, aber etwas vertraut mit C. Ich wollte wissen - welche Unterschiede gibt es zwischen C-Strukturen und Java-Objekten und rufen ihre Methoden auf? Oder sind die völlig gleichwertig?
Zum Beispiel die Fahrradstruktur:
%Vor%Der Grund, warum ich frage, ist, weil sie so ähnlich aussehen! Danke!
Wenn Sie die Methode außer Kraft setzen, können Sie sich Java-Klassen und -Methoden als ein Paar C-style struct
und eine Reihe von Funktionen vorstellen, die mit diesen struct
s arbeiten. Zum Beispiel, wenn Sie eine Klasse wie folgt haben:
Dies wäre ähnlich dem Schreiben von C-Code zu diesem Effekt:
%Vor% Die Grundidee ist, dass eine Methode einer Funktion ähnelt, die das Empfängerobjekt als impliziten "this" -Parameter verwendet. In C müssen Sie den Empfänger explizit als Parameter an die Funktion übergeben, während dies in Java implizit durch die object.method()
-Syntax geschieht.
Wenn Sie das Überschreiben von Methoden einleiten, wird dies etwas komplizierter, da die Methode, die Sie für ein Objekt aufrufen, vom dynamischen -Typ des Objekts und nicht vom statischen tippen. Eine Möglichkeit, dies zu simulieren, ist die Verwendung einer virtuellen virtuellen Funktionstabelle vtable oder , , die so benannt ist, weil C ++% virtual
ist. Die Idee ist, dass jedes Objekt einen Zeiger auf eine Tabelle von Funktionszeigern speichert, einen pro Funktion, die überschrieben werden kann, und wenn eine Methode für das Objekt aufgerufen wird, wird der entsprechende Funktionszeiger aus der Tabelle ausgewählt und aufgerufen. Das obige Java-Objekt könnte also etwa so aussehen:
Immer wenn Sie eine Instanz von MyJavaClass
erstellt haben, haben Sie ihre vtable wie folgt eingerichtet:
Wenn Sie dann eine Funktion wie diese (in Java) aufrufen:
%Vor%In C würde es wie
aussehen %Vor%In gewisser Weise ist eine Java-Klasse nur eine Struktur mit einigen zusätzlichen Metainformationen. Natürlich sieht es für den Programmierer völlig anders aus - es gibt Kapselung, Polymorphie, ein strengeres Typsystem usw. - aber auf der Ebene von nativem Code sehen eine reguläre C-Struktur und eine Java-Klasse wahrscheinlich sehr ähnlich aus.
Hoffe, das hilft!
Mit einer Java-Klasse können Sie Felder wie eine C-Struktur definieren, haben aber die folgenden zusätzlichen Funktionen:
private
(und einige andere Zugriffseinstellungen) deklarieren, was bedeutet, dass nur andere Methoden der Klasse auf sie zugreifen können, nicht von außen. (Es wäre nicht sinnvoll, dies auf Strukturen zu haben, da es keine Möglichkeit gibt, auf private Felder zuzugreifen - dies macht nur Sinn, wenn Sie Methoden zulassen). Es gibt noch einen weiteren feinen Unterschied. In C sind Strukturen -Werttypen , aber in Java sind Klassen Referenztypen . Das bedeutet, wenn Sie eine Struktur in C kopieren (z. B. eine Variable zuweisen oder als Argument übergeben), werden alle Felder kopiert, während in Java beim Kopieren eines Klassenobjekts nur die Referenz kopiert wird für das Objekt (wenn Sie also seine Felder ändern, ändern Sie auch das ursprüngliche Objekt, nicht nur die Kopie).
In C verwenden Sie oft Zeiger auf Strukturen, um das Referenzverhalten von Java zu emulieren. In Java verwenden Sie keine Zeiger, da Klassenobjekte bereits Referenzen sind.