Seltsames Verhalten...

Hallo :)

ich habe gerade beim Programmieren n kleines Phänomen. Ich poste mal ne "vereinfachte Version".

Java:
public abstract class TestAbstract1 {
	public TestAbstract1(){
		init();
	}
	protected abstract void init();
}

Java:
public abstract class TestAbstract2 extends TestAbstract1 {
	String test = "not changed";
	public TestAbstract2(){
		super();
	}
	protected void init() {
		test = "changed";
		System.out.println("changed test");
	}
}

Java:
public class TestClass extends TestAbstract2{
	public TestClass(){
		super();
		System.out.println("check 1: "+test);
	}
}

Java:
public class Test {
	public static void main(String[] args) {
		TestClass t = new TestClass();
		System.out.println("check 2: "+t.test);
	}
}

Wenn ich jetzt die main ausführe bekomme ich folgendes log:

changed test
check 1: not changed
check 2: not changed

Es ist als wenn das in folgender Reihenfolge ausgeführt wird:

1. String test = null;
2. [constructor -> test = "changed";]
3. test = "not changed";

Obwohl es meines Wissens nach so ablaufen müsste:

1. String test = "not changed"
2. [constructor -> test = "changed;]


Ist dieses Verhalten normal?
Es ist doch normalerweise z.b. sowas möglich:

Java:
ArrayList<String> liste = new ArrayList<>();
public Test2(){
	liste.add("test");
}

Warum hier nicht? Hier würde ich ne NPE erhalten weil liste null ist.
 
Zuletzt bearbeitet:

nvidia

Bekanntes Mitglied
Zuletzt bearbeitet:
Ganz, ganz schlechte Idee so einen Code zu schreiben. Damit kann man sich unglaublich viele Probleme einhandeln, deshalb lieber lassen. Auf die Schnelle hier eine kurze Erläuterung java - What's wrong with overridable method calls in constructors? - Stack Overflow.

Oh, das ist die Erklärung! Eigentlich ganz logisch. Ich hatte vermutet die Variablen werden auch in den Subklassen zuerst definiert bevor der Superklassenkonstruktor durchläuft, aber da habe ich mich wohl getäuscht. Könnte man das dann so machen?
in TestAbstract1:
Java:
public static TestAbstract1 getInstance(Class <? extends TestAbstract1> subclass){
	TestAbstract1 t = subclass.newInstance();
	t.init();
}
dementsprechend in Test
Java:
public static void main(String[] args) {
	TestClass t = (TestClass) TestAbstract1.getInstance(TestClass.class);
	[...]
}
 
Zuletzt bearbeitet:

nvidia

Bekanntes Mitglied

Könnte man, aber zuerst solltest du wissen das newInstance auch merkwürdiges Verhalten verursachen kann. Es ist so eine Art Wurmloch für Exceptions, im Programm taucht eine auf aber du hast keinen Hinweis darauf das es durch newInstance verursacht wird.

Der bessere Weg wäre
Java:
 public static <T extends TestAbstract1> T getInstance(Class<T> subclass)
            throws NoSuchMethodException, IllegalAccessException, InvocationTargetException, InstantiationException {
        T t = subclass.getDeclaredConstructor().newInstance();
        t.init();
        return t;
    }

Falls du dich wunderst weshalb ich getDeclaredConstructor(...) verwende anstelle von getConstructor(...), die erste Methode ignoriert die Zugriffsmodifkatoren (public, private usw.) letztere nicht. Wobei ich solange es geht die "strengere" Variante bevorzugen würde, hier aber exemplarisch mal die andere gewählt habe.

Na jedenfalls erlaubt die obige Implementierung auf die unterschiedlichen Fehler besser zu reagieren. Für mehr Ausführungen wg. newInstance und eine nebenbei ganz nette Einführung in die Grundlagen von Java-Reflection kann sich folgendes Video angesehen werden. The Live Reflection Madness on Vimeo Bei Minute 27 rum fängt das Bsp. zu newInstance an.
 
Zuletzt bearbeitet:
Ähnliche Java Themen
  Titel Forum Antworten Datum
B Programm beendet sich nicht und weiteres seltsames Verhalten Java Basics - Anfänger-Themen 9
MiMa Seltsames Verhalten im Konstruktor Java Basics - Anfänger-Themen 6
A Seltsames Verhalten beim ButtonClick (ActionListener() ) Java Basics - Anfänger-Themen 7
S Compiler-Fehler Seltsames Typverhalten eines Iterators Java Basics - Anfänger-Themen 3
P Seltsames numerisches Problem Java Basics - Anfänger-Themen 5
K Seltsames Ergebnis in Netbeans bei einfacher Multiplikation Java Basics - Anfänger-Themen 5
J Doppelte Integer aus einem Array entfernen - seltsames Prob. Java Basics - Anfänger-Themen 5
F Seltsames Konstrukt? Java Basics - Anfänger-Themen 5
S Seltsames Java Problem Java Basics - Anfänger-Themen 3
M seltsames Phänomen in der Auswertung boolscher Variablen Java Basics - Anfänger-Themen 7
D Seltsames Problem mit this! Java Basics - Anfänger-Themen 19
M Seltsames java.util.Date Problem Java Basics - Anfänger-Themen 6
M Seltsames Problem Java Basics - Anfänger-Themen 4
R Datentypen Das Verhalten von Strings als Datentypen Java Basics - Anfänger-Themen 7
MarvinsDepression Operatoren Verhalten von BitShiftOperatoren Java Basics - Anfänger-Themen 2
G Merkwürdiges Verhalten der Maven IDE Java Basics - Anfänger-Themen 3
D Unerwartetes Verhalten bei Client Server Chat App Java Basics - Anfänger-Themen 12
G unklares Verhalten nach Instanzierung neuer Klasse Java Basics - Anfänger-Themen 3
M Komisches Verhalten der Variablen Java Basics - Anfänger-Themen 6
K Klassen Eclipse Verhalten bei Klassen Java Basics - Anfänger-Themen 16
M Verhalten von LocalDateTime#getNano() Java Basics - Anfänger-Themen 1
T Objekte mit Verhalten Java Basics - Anfänger-Themen 14
D Klassen Verhalten von Klassenvererbung bei Variablen Java Basics - Anfänger-Themen 1
O JFileChooser Verhalten -Pfad Java Basics - Anfänger-Themen 15
S Verhalten von JTextField in einem JTabbedPane (Register) Java Basics - Anfänger-Themen 6
G Input/Output Verhalten BuffferedReader bei unvollständigen Zeichen Java Basics - Anfänger-Themen 1
D Interface für Verhalten von "=="? Java Basics - Anfänger-Themen 21
B Thread komisches Verhalten auf Mac ... Java Basics - Anfänger-Themen 6
B Komisches Verhalten von ArrayList Java Basics - Anfänger-Themen 6
S JInternalFrame in JInternalFrame - Verhalten Java Basics - Anfänger-Themen 2
F Nicht nachvollziehbares Verhalten Java Basics - Anfänger-Themen 7
K Komisches Verhalten beim erstellen einer Datei Java Basics - Anfänger-Themen 5
T unerklärliches Verhalten von Scanner Java Basics - Anfänger-Themen 2
Ham Verhalten beim Initialisieren von Arrays Java Basics - Anfänger-Themen 16
D Komisches Verhalten einer For-Schleifen Java Basics - Anfänger-Themen 7
zilti Unlogisches Verhalten Java Basics - Anfänger-Themen 4
N public void und verhalten bei return Java Basics - Anfänger-Themen 2
P Komisches Verhalten von BufferedReader und readLine() Java Basics - Anfänger-Themen 2

Ähnliche Java Themen

Neue Themen


Oben