Warum hat Java keine Initialisierungslisten wie in C ++?
In C++ können Sie eine Initialisierungsliste zum initialisieren der Klasse die Felder vor dem Konstruktor der Ausführung beginnt. Zum Beispiel:
Foo::Foo(string s, double d, int n) : name(s), weight(d), age(n) {
//Empty; already handled!
}
Ich bin neugierig, warum Java nicht haben eine ähnliche Funktion. Nach Core Java: Volume 1:
C++ verwendet diese spezielle syntax rufen Sie Feld-Konstruktoren. In Java gibt es keine Notwendigkeit für Sie, da Objekte keine Unterobjekte, nur Zeiger auf andere Objekte.
Hier sind meine Fragen:
- Was bedeuten Sie durch ", weil Objekte keine Unterobjekte?" Ich verstehe nicht, was ein teilobjekt ist (ich habe versucht es); bedeuten Sie eine Instanziierung einer Unterklasse, die sich ein Oberklasse?
- Als dafür, warum Java nicht Initialisierer-Listen wie C++, ich würde davon ausgehen, dass der Grund ist, weil alle Felder sind bereits initialisiert ist standardmäßig in Java und auch da Java verwendet die
super
Schlüsselwort zum Aufruf der super(oder base in C++, lingo)-Konstruktor der Klasse. Ist das richtig?
InformationsquelleAutor der Frage Jesse Good | 2011-08-22
Du musst angemeldet sein, um einen Kommentar abzugeben.
In C++, Initialisierer-Listen sind notwendig, da einige Funktionen der Sprache, die entweder nicht vorhanden in Java oder funktionieren anders in Java:
const
: In C++ definieren Sie die Felder, die markiert sindconst
, die zugeordnet werden kann-und muss initialisiert werden, in der Initialisierungsliste. Java hatfinal
Felder, aber Sie können zuweisenfinal
Felder in den Körper eines Konstruktors. In C++ ist die Zuweisung an eineconst
Feld im Konstruktor ist illegal.Referenzen: In C++, Referenzen (im Gegensatz zu Zeigern) muss initialisiert werden, zum binden an ein Objekt. Es ist illegal, um einen Verweis zu erstellen, ohne eine Initialisierung. In C++, die Art und Weise, die Sie angeben, ist dies mit der Initialisierungsliste, da Sie wenn Sie waren zu beziehen, wird die Referenz in den Körper des Konstruktors ohne zuerst initialisieren Sie verwenden eine nicht initialisierte Referenz. In Java -, Objekt-Referenzen Verhalten sich wie C++ Zeiger zugewiesen werden können, um nach angelegt. Sie einfach standardmäßig auf
null
sonst.Direkte Unterobjekte. In C++ kann ein Objekt enthalten Objekt direkt als Felder, in der Erwägung, dass in Java können Objekte nur halten Referenzen auf diese Objekte. Das heißt, in C++, wenn Sie deklarieren ein Objekt, das eine
string
als Mitglied der Speicherplatz für die Zeichenfolge direkt in den Speicherplatz für das Objekt selbst, während in Java bekommst du nur Platz für einen Verweis auf einige andereString
Objekt an einem anderen Ort gespeichert. Folglich, C++ benötigt, um bieten eine Möglichkeit für Sie geben, um diejenigen Teilobjekte ursprünglichen Werte, denn sonst würden Sie nur bleiben, nicht initialisiert. Standardmäßig verwendet es die Standard-Konstruktor für diese Typen, aber wenn Sie möchten, verwenden Sie einen anderen Konstruktor oder kein default-Konstruktor vorhanden ist, wird der Initialisierer-Liste gibt Ihnen einen Weg zur Umgehung dieser. In Java, Sie brauchen nicht zu kümmern, denn die Referenzen werden standardmäßignull
, und Sie können dann ordnen Sie beziehen sich auf die Objekte, die Sie tatsächlich wollen, um Sie zu finden. Wenn Sie möchten, verwenden Sie eine nicht-Standard-Konstruktor, dann brauchen Sie keine spezielle syntax für es; nur die Referenz auf ein neues Objekt initialisiert, über den entsprechenden Konstruktor.In den wenigen Fällen, in denen Java vielleicht möchten Initialisierer-Listen (zum Beispiel, zu nennen Superklasse Konstruktoren oder geben Standardwerte für die Felder), dies geschieht durch zwei Funktionen für andere Sprachen: das
super
Schlüsselwort zum aufrufen Oberklasse-Hersteller, und die Tatsache, dass Java-Objekte geben kann, die Ihre Felder mit default-Werten an der Stelle an der Sie deklariert sind. Da C++ die Mehrfachvererbung, nur mit einer einzigensuper
Schlüsselwort wäre nicht eindeutig beziehen sich auf eine einzelne Basisklasse, und vor C++11 C++ nicht unterstützt Standard-Initialisierungen in eine Klasse und waren darauf angewiesen, Initialisierer-Listen.Hoffe, das hilft!
InformationsquelleAutor der Antwort templatetypedef
C++
Gibt es einen Unterschied zwischen
und
Letztere brauchen nicht initialisiert (auf NULL gesetzt). Der ehemalige hat. Betrachten Sie es als eine ganze Zahl. Sie können nicht über ein int ohne Wert, ABER Sie können ein int-Zeiger ohne Wert.
So, wenn Sie haben:
Dann die Erklärung:
erstellt automatisch eine Instanz der
OtherClass
imvalue
. Deshalb, wennOtherClass
hat Initialisierung, es muss getan werden in derClassType
Konstruktor. Allerdingsreference
ist nur ein Zeiger (Adresse im Speicher) und bleiben kann nicht initialisiert. Wenn Sie möchten, eine Instanz vonOtherClass
müssen SieJava
Gibt es nur
Dies ist äquivalent zu einem Zeiger in C++. In diesem Fall, wenn Sie tun:
Du nicht automatisch erstellen Sie eine Instanz der
OtherClass
. Sie müssen sich also nicht initialisieren, etwas in den Konstruktor, es sei denn, Sie wollen. Wenn Sie wollen ein Objekt vonOtherClass
können SieInformationsquelleAutor der Antwort George
Da in Java nicht benötigen, Sie zu erlauben die Initialisierung von Feldern, deren Typ hat keine null-Wert.
In C++
ohne member-Initialisierung für
d
,D::D()
aufgerufen werden, was es unmöglich macht Sie zum initialisieren das Feld, wenn es kein null-Typ fürD
. Dies kann passieren, wennD::D()
ausdrücklich erklärtprivate
.In Java gibt es eine bekannte null-Wert für alle Referenz-Typen
null
, so ein Feld kann immer initialisiert werden.Java macht auch einen Haufen Arbeit, um sicherzustellen,* dass alle
final
Felder werden initialisiert vor dem ersten Gebrauch und vor dem Konstruktor enden, so dass während Java eine Anforderung wie C++'sconst
Feld-Initialisierung Anforderung, die es nur überlastungenthis.fieldName = <expression>
im Konstruktor Körper zu mean-field-Initialisierung.InformationsquelleAutor der Antwort Mike Samuel