Was ist der Unterschied zwischen C-Strukturen und Java-Klassen?

7

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!

    
O_O 23.03.2011, 23:35
quelle

4 Antworten

13

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:

%Vor%

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:

%Vor%

Immer wenn Sie eine Instanz von MyJavaClass erstellt haben, haben Sie ihre vtable wie folgt eingerichtet:

%Vor%

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!

    
templatetypedef 23.03.2011, 23:46
quelle
4

C struct kann keine Methoden / Funktionen enthalten. Es ist nur eine Sammlung verschiedener Datentypen. class kann sowohl Variablen als auch Methoden deklariert haben.

    
Mahesh 23.03.2011 23:38
quelle
2

Mit einer Java-Klasse können Sie Felder wie eine C-Struktur definieren, haben aber die folgenden zusätzlichen Funktionen:

  • Wie Sie in Ihrer Frage angeben, können Sie Methoden zu einer Klasse hinzufügen, die mit den Daten arbeiten kann.
  • Sie können sowohl die Felder als auch die Methoden 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).
  • Klassen können von anderen Klassen erben. Auf diese Weise können Sie unter anderem ein Objekt vom Typ B übergeben, für das ein Typ A erwartet wurde, solange B von A übernommen wird.

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.

    
mgiuca 23.03.2011 23:51
quelle
1

Die wichtigsten Unterschiede, IMHO sind, dass Klassen

erlauben

Dies sind zwei sehr wichtige Eigenschaften von OOP.

    
JB Nizet 23.03.2011 23:43
quelle

Tags und Links