Du verwendest einen veralteten Browser. Es ist möglich, dass diese oder andere Websites nicht korrekt angezeigt werden. Du solltest ein Upgrade durchführen oder ein alternativer Browser verwenden.
Warum funktioniert das und wann erden die Objektmethoden nun ausgeführt?
ich besitze momentan das Wissen, dass die this-Anweisung als erstes in einem Konstruktor stehen muss, damit ein Aufruf zum anderen Konstruktor in derselben Klasse möglich ist, sodass man bei einem this-Anweisung keine Objekteigenschaften als Argumente verwenden darf, da die Objektvariablen am Anfang eines jeden Konstruktors initialisiert wird. Das gleiche Verhalten zeigt sich ebenfalls bei Klassenvariablen, die am Anfang eines Klasseninitialisierer initialisiert werden.
Nun meine frage: Hier ist nun folgender Code, warum kann i und o nach diesen Regeln her als erste Anweisung stehen:
Java:
public class Objektmethode {
String printed;
String i = "e";
int o = 2;
public Objektmethode(){
this("/"); // Warum funktioniert dies, obwohl der Compiler die Objektvariable i und o vor dem this-Aufruf initialisiert.
} // Dieser gibt zwar einen "tipp", der genau so lautet wie eine Fehlermeldung ( Fehlermeldung: Cannot refer to an instance field...), aber es lässt sich kompilieren. Wieso?
public Objektmethode(String i){
System.out.println(i);
this.printed = i;
}
public String print(String name) {
System.out.println(name);
return name;
}
public static void main(String[] args){
Objektmethode o = new Objektmethode();
}
}
Java:
public class Objektmethode {
String printed;
String i = "e";
int o = 2;
public Objektmethode(){
this(print("/")); // Hier: Cannot refer to an instance method while explicitly invoking a constructor
}
public Objektmethode(String i){
System.out.println(i);
this.printed = i;
}
public String print(String name) {
System.out.println(name);
return name;
}
public static void main(String[] args){
Objektmethode o = new Objektmethode();
}
}
Hier wäre meine Frage, wann den die Objektmethoden ausgeführt werde. Etwa am Anfang eines Blockes oder ,wie es hier zu sehen ist am Anfang eines Konstrutors?
Ich wäre euch sehr dankbar, wenn ihr mir antworten würdet.
Es muss auch keine ausgiebige Erklärung sein. Ihr könnt mir auch einfach ein paar Stichwörter an den Kopf schmeißen. Den Rest schaue und eigne ich mir selbst an.
die objektvariablen, welche du bereits bei ihrer deklaration zugewiesen hast, werden noch vor dem konstruktor gesetzt. Genau genommen im initializer. Dementsprechend kannst du alles was bereits im initializer gesetzt wurde auch direkt mit this(...) weiterverwenden.
Java:
public Objektmethode(){
this("/"); // Warum funktioniert dies, obwohl der Compiler die Objektvariable i und o vor dem this-Aufruf initialisiert.
}
warum sollte dass nicht funktionieren?
i und o werden noch vor dem Aufruf mit "e" bzw. 2 initialisiert. Dann machst du den this("/") Aufruf und der andere Konstruktor wird genutzt. Dieser überschreibt dann eben den Wert von i mit "/".
Java:
public Objektmethode(){
this(print("/")); // Hier: Cannot refer to an instance method while explicitly invoking a constructor
}
hier ist halt das problem, das dein this nicht der erste Aufruf ist.
Denn der eigentlich this-Aufruf findet logischerweise erst statt, wenn du das Ergebnis von print("/") hast.
=> print wird aufgerufen und danach wird this aufgerufen => Fehler, da Instanzmethoden erst genutzt werden dürfen, nachdem der this() Aufruf stattfindet.
Im Initialisiere? Welcher Initialisierer? Ich hab im Buch ( Java ist auch eine Insel ) gelesen, dass der Compiler die Initialisierungen in den Konstruktoren vornimmt. Könntest du mi bitte ein Link zu einer Erläuterung schcken oder es selber erklären, was und wie den der Initialisierer funktioniert.
Das Buch, dass ich derzeit lese sagt, dass der Compiler zum Beispiel aus:
Es stimmt, dass der Compiler diese Zuweisungen direkt in den Konstruktoraufruf einfügt. Dies geschieht allerdings auf Bytecode ebene. Aus Benutzersicht ist es ggf. etwas einfacher sich dies als separaten Bereich vorzustellen.
Bei Bedarf kann man den initialisierer auch explizit einbauen:
Java:
public class Test {
public int val;
//init bereich
{
val=42;
}
public Test() {
}
}
Der Compiler fügt diesen Code einfach am Anfang des Konstruktors ein.
Ich danke dir sehr!
Man muss sich also die funktionsweise als seperaten Bereich vorstellen. Deine expliziter Bereich wäre doch ein Instanzinitialsierer oder ist das einfach als "neuer" Block gedacht?
Danke dir nochmal für die Erläuterung des Zusammenhangs