Was ist eine Initialisierungs-block?
Können wir code in einen Konstruktor oder eine Methode oder eine Initialisierungs-block. Was ist die Verwendung von Initialisierungs-block? Ist es notwendig, dass jedes java-Programm muss es haben?
Meinst du eine init () - Funktion aufgerufen oder nach dem constructoe? Oder ein sttatic block deklariert, die außerhalb jeder Methode?
Ich kann nicht klar sehen, was ist Ihre Frage, vielleicht auch der Titel ist ein wenig irreführend
mögliche Duplikate von die Verwendung von Initialisierungen vs-Konstruktoren in Java
Ich kann nicht klar sehen, was ist Ihre Frage, vielleicht auch der Titel ist ein wenig irreführend
mögliche Duplikate von die Verwendung von Initialisierungen vs-Konstruktoren in Java
InformationsquelleAutor Sumithra | 2010-10-21
Du musst angemeldet sein, um einen Kommentar abzugeben.
Zunächst, es gibt zwei Arten von Initialisierung blockiert:
Dieser code soll zeigen, wie und in welcher Reihenfolge Sie ausgeführt werden:
Drucke:
Instanz itialization Blöcke sind nützlich, wenn Sie wollen, um einige code ausführen, unabhängig davon, welcher Konstruktor verwendet wird oder wenn Sie wollen, um einige der Instanz-Initialisierung für anonyme Klassen.
So können Sie gemeinsame code, wenn man mehrere Konstruktoren ohne Verwendung eines
init()
- Methode (die jemand aktualisieren kann die Klasse vergessen zu nennen),wellerif seine wird ausgeführt, bevor der Konstruktor kommen, wie es ermöglicht
this
Stichwort Insider-Instanz initialisieren block .this
ist curernt Klasse Objekt und es wird gebaut, voll nach dem Konstruktor-Aufruf beendet richtig?InformationsquelleAutor aioobe
hinzufügen möchte, @aioobe Antwort
Reihenfolge der Ausführung:
statische Initialisierungs-blocks von super-Klassen
statische Initialisierungs-blocks der Klasse
Instanz-Initialisierung Blöcke von super-Klassen
Konstruktoren von Superklassen
Instanz-Initialisierung Blöcke der Klasse
Konstruktor der Klasse.
Ein paar zusätzliche Punkte zu beachten (Punkt 1 ist die Wiederholung von @aioobe Antwort):
Den code im statischen Initialisierungs-block wird ausgeführt, die von der Klasse Ladezeit (und ja, das bedeutet, dass nur einmal pro Klasse laden), bevor Instanzen der Klasse aufgebaut sind und vor allen statischen Methoden aufgerufen werden.
Die Instanz-Initialisierung-block ist tatsächlich kopiert, die vom Java-compiler in jeden Konstruktor der Klasse hat. Also jedes mal, wenn Sie den code in die Instanz-Initialisierung-block ausgeführt genau, bevor der code im Konstruktor.
hier gehen Sie: docs.oracle.com/javase/specs/jls/se8/html/jls-12.html#jls-12.7
InformationsquelleAutor Biman Tripathy
nette Antwort von aioobe
hinzufügen paar mehr Punkte
diese gibt
wie seine Aussage offensichtlich aber scheint ein wenig klarer.
InformationsquelleAutor Gaurav
Den Beispiel-code, das ist anerkannt als eine Antwort hier richtig ist, aber ich Stimme nicht mit ihm. Es nicht zeigt, was geschieht, und ich werde Ihnen zeigen, ein gutes Beispiel, um zu verstehen, wie die JVM arbeitet:
Bevor zu beginnen, zu kommentieren, auf den source-code, ich werde geben Sie eine kurze Erläuterung der statischen Variablen einer Klasse:
Erste Sache ist, dass Sie als Klasse bezeichnet Variablen, Sie gehören zu der Klasse, die nicht bestimmte Instanz der Klasse. Alle Instanzen der Klasse teilen sich diese statische(Klassen -) variable. Jeder und jede variable hat einen Defaultwert, abhängig von primitiv-oder Verweis-Typ. Eine andere Sache ist es, wenn Sie zum zuweisen der statischen Variablen in einige der Elemente der Klasse (Initialisierungs-Blöcke, Konstruktoren, Methoden, Eigenschaften) und tun so ändern Sie den Wert der statischen Variablen nicht für eine bestimmte Instanz, die Sie ändern es für alle Instanzen. Zum Abschluss statischen Teil werde ich sagen, dass die statischen Variablen einer Klasse erstellt werden, nicht beim instanziieren zum ersten mal die Klasse, die Sie erstellt, wenn Sie definieren Ihre Klasse, Sie existieren in der JVM ohne Instanzen. Deswegen wird der korrekte Zugriff auf statische Mitglieder von externen class (Klasse, in der Sie nicht definiert sind), ist die Verwendung des Klassennamens der durch den dot und dann das statische Element, das Sie zugreifen möchten (Vorlage:
<CLASS_NAME>.<STATIC_VARIABLE_NAME>
).Schauen wir uns nun den obigen code:
Den Einstiegspunkt ist die main-Methode - es gibt nur drei Zeilen code. Ich möchte verweisen auf das Beispiel, die derzeit genehmigt. Entsprechend ist es das erste, was gedruckt werden muss nach dem Druck von "Static Initialization block" ist "Initialization block" und hier ist mein Uneinigkeit, die nicht-statischen Initialisierungs-block nicht aufgerufen wird, bevor der Konstruktor aufgerufen wird, bevor irgendwelche Initialisierungen der Konstruktoren der Klasse, in der die Initialisierungs-block definiert ist. Der Konstruktor der Klasse ist die erste Sache, die beteiligt ist, wenn Sie ein Objekt erzeugen (Instanz der Klasse) und dann wenn Sie den Konstruktor der erste Teil aufgerufen wird, entweder implizit (default) super-Konstruktor oder einem expliziten super-Konstruktor oder einem expliziten Aufruf einer anderen überladenen Konstruktor (aber an einem gewissen Punkt, wenn es eine Kette von überladenen Konstruktoren, die Letzte nennt man einen super-Konstruktor implizit oder explizit).
Gibt es polymorphes erstellen eines Objekts, aber vor dem betreten der Klasse B und die wichtigste Methode, die JVM initialisiert alle Klasse(static) Variablen, und geht dann durch die statische Initialisierungs-blocks, falls vorhanden und dann in der Klasse B und beginnt mit der Ausführung der main-Methode. Es geht um den Konstruktor von Klasse B, dann sofort (implizit) ruft Konstruktor der Klasse A, mit Polymorphie die Methode(überschriebene Methode) genannt, in den Körper des Konstruktors der Klasse A ist in Klasse B definiert und in diesem Fall die variable mit dem Namen instanceVariable verwendet wird, bevor eine erneute Initialisierung. Nach dem schließen der Konstruktor der Klasse B den thread zurückgegeben wird an den Konstruktor der Klasse B, sondern es geht zuerst um den nicht-statischen Initialisierungs-block vor dem drucken "Konstruktor". Für ein besseres Verständnis Debuggen mit einigen IDE bevorzuge ich Eclipse.
Manchmal, diese langatmig Erklärungen bekommen können unerwartet populär. Entweder, wenn diese bitten, die ursprüngliche Frage brauche wirklich langatmig Erklärung zu erhalten, Ihre Grundlagen gerade. Oder wenn die Leute Lesen, die Antwort von selbst, wenn es ein blog zu einem bestimmten Thema. In diesem Fall ist es weder noch, würd ich sagen.
Ich denke, dass Ihr Kommentar auf die akzeptierte Antwort ist irreführend. Ich möchte Sie ermutigen, formuliere es etwas mehr wie "ich habe eine differenzierte Erklärung, die von Interesse sein können." Die akzeptierte Antwort scheint zu sein, genau richtig, einfach nicht so detailliert wie deine.
Pierce: Die akzeptierte Antwort wurde geändert, nachdem mein Kommentar. Mein Satz gibt nicht nur die Antwort sondern auch einige zusätzliche Informationen, die ich denke, ist nützlich für die junior-und intermediate-level Java-Entwickler.
InformationsquelleAutor nenito
Initialisierung-block enthält den code, der immer ausgeführt wird, wenn eine Instanz erstellt wird. Es wird verwendet, um zu deklarieren/initialisieren der gemeinsame Teil verschiedener Konstruktoren einer Klasse.
Die Reihenfolge der Initialisierung-Konstruktoren und Initialisierer block ist egal, Initialisierung-block wird immer ausgeführt, bevor der Konstruktor.
Was ist, wenn wir wollen, dass Sie einige code, der nur einmal für alle Objekte einer Klasse?
Wir mit Statischen Block in Java.
InformationsquelleAutor roottraveller
Initialisierungs-Blöcke werden ausgeführt, sobald die Klasse initialisiert wurde und bevor die Konstruktoren aufgerufen werden. Sie sind meist oberhalb der Konstruktoren innerhalb von geschweiften Klammern. Es ist überhaupt nicht notwendig, um Sie in Ihre Klassen.
Werden Sie in der Regel zur Initialisierung von Referenzvariablen. Diese Seite gibt eine gute Erklärung
InformationsquelleAutor Gaurav Saxena
Die Frage ist nicht ganz klar, aber hier ist eine kurze Beschreibung von Möglichkeiten, wie Sie können, initialisieren Sie Daten in einem Objekt. Nehmen wir an, Sie haben eine Klasse A, die hält eine Liste von Objekten.
1) Legen Sie die ursprünglichen Werte in der Feld-Deklaration:
2) Ordnen Sie die ursprünglichen Werte in den Konstruktor:
Diesen beiden davon ausgehen, dass Sie nicht wollen, um pass "Daten" als argument im Konstruktor.
Erhalten die Dinge ein wenig schwierig, wenn Sie mischen, überladene Konstruktoren mit internen Daten wie oben. Bedenken Sie:
Feststellen, dass es viel code wiederholt. Sie können dieses Problem beheben, indem Sie die Konstruktoren gegenseitig aufrufen, oder Sie können eine private Initialisierung der Methode, dass jeder Konstruktor ruft:
oder
Sind die beiden (mehr oder weniger) entspricht.
Ich hoffe, dass gibt Ihnen einige Hinweise, wie Sie zu initialisieren Daten in den Objekten. Ich will nicht darüber reden statische Initialisierungs-blocks, wie das ist, wahrscheinlich ein bisschen Fortgeschrittener im moment.
EDIT: ich habe interpretiert Ihre Frage "wie kann ich meine initialisieren Instanz-Variablen", nicht "wie initialiser Blöcke arbeiten" als initialiser Blöcke sind ein relativ fortschrittliches Konzept, und aus dem Ton der Frage scheint es, dass Sie sich Fragen, über das einfachere Konzept. Ich könnte falsch sein.
InformationsquelleAutor Cameron Skinner
Ausgabe:
InformationsquelleAutor Anıl Emre Özçelik
Initialism Zeigt den text innerhalb der
<abbr>
element in einer etwas kleineren SchriftgrößeInformationsquelleAutor Anandkumar Prajapati