Klassen: Wann initialisiere ich wo meine Variabeln

  • Themenstarter Themenstarter Guest
  • Beginndatum Beginndatum
Status
Nicht offen für weitere Antworten.
G

Guest

Gast
Ich habe ein grundsätzliche Frage:

In welchem Fall initialisiert ihr die Variabeln als Standardwert (also ausserhalb einer Methode) und wann tut ihr das im Konstruktor?
Und wieso?
Ich bin bisher so vorgegangen, dass ich Variablen (oder meinetwegen auch eine Konstante etc.) "gleich zu beginn" der Klasse ausserhalb des Konsturktors initialisiere, und wenn nötig diese in einem oder mehreren Konstruktoren verändert habe...
Wie handhabt ihr dass und weshalb?

Vielen Dank für eure Antworten.
 
Anonymous hat gesagt.:
Ich habe ein grundsätzliche Frage:

In welchem Fall initialisiert ihr die Variabeln als Standardwert (also ausserhalb einer Methode) und wann tut ihr das im Konstruktor?
Und wieso?
Ich würde alle Instanzvariablen im Konstruktor ihren Wert zuweisen. Dort wird das Objekt instanziert, dahin gehören dann auch die Standart werte (höchsten man will explizit z.B. für Instanzvariablen 'null' haben - aber selbst dann würde ich es im Konstruktor explizit schreiben, damit klar wird, das ist Absicht !!)
Anonymous hat gesagt.:
Ich bin bisher so vorgegangen, dass ich Variablen (oder meinetwegen auch eine Konstante etc.) "gleich zu beginn" der Klasse ausserhalb des Konsturktors initialisiere, und wenn nötig diese in einem oder mehreren Konstruktoren verändert habe...
Wie handhabt ihr dass und weshalb?
Was meinst du mit "gleich zu Beginn" - bei Instanzvariablen wird das ja schwierig. Außerdem Konstante einer Klasse sollten sind statische Variablen der Klasse, die nicht mehr geändert werden sollten - also gehören sie meiner Meinung nach in der Klasse gesetzt und von nirgends sonst. Statische Variablen können vor der Instanzierung gesetzt werden...
 
Hmm... ok, danke!

Habe ich das jetzt richtig verstanden: Instanzvariabeln sind solche, welche in jedem Objekt instanziert werden. Das Gegenstück dazu sind die statischen Variabeln, welche Klassenweit gelten...?

Einerseits sehe ich das voll ein, dass man die Werte in den Konstruktoren zuweist. Andererseits habe ich den folgenden Gedanken:
Wenn ich eine Instanzvariable habe, welcher in allen Konstruktoren den selben Startwert zugewiesen würde, macht es dann nicht Sinn, diese in der Klasse zu setzen, um den Code um einige Linien zu verkleinern (angenommen, wir haben viele Konstruktoren). Oder macht dies nicht viel aus?

Mit "Gleich zu Beginn" meinte ich, ausserhalb des Konstruktors. (=Klassendefinition? Stimmt die Bezeichnung)
 
Hallo,
zunächst mal: Es gibt da wohl ziemliche Unterschiede bei den IDEs. Der von PowerJ erzeugte Code z.B. initialisiert massenhaft Objektvariablen seiner Forms (die ganzen awt/swing-Komponenten!) im Deklarationsteil.

Folgender Code kann einem bei der Entscheidung helfen, wo eine Objektvariable vernünftigerweise zu initialisieren ist:
Code:
class Parent {
	
	// Konstruktor
  	Parent() { 
		getDefinitions(); 
	}

	// Methode zum Überschreiben, soll im Deklarationsteil initialisierte 
	// Variablen ausgeben...

	void getDefinitions() {} // Laufzeitvariante aufrufen!
}

class Child extends Parent {
	String testString = new String("Test");
	Object testObject = new Object();	
	Child() {
		super(); // Explizit, dass man sieht, wie das gemeint ist !!!
	}

	// Diese Methode soll die Child-Varianlen ausgeben,
	// und zwar im Parent-Konstruktor.
	void getDefinitions() {
		System.out.println(testString);
		System.out.println(testObject);
	}
}

public class Test {
	public static void main(String args[]) {
		new Child().getDefinitions();
	}
}

Der Output der Klasse Test ist:
Code:
null
null
Test
java.lang.Object@7ced01

Was lernen wir daraus? Richtig, die im Deklarationsteil initialisierten Objektvariablen erhalten ihre Werte auch erst beim Konstruktoraufruf - und zwar nach der Rückkehr aus dem super-Konstruktor. Ergo isses wurscht.

Die NullPointerException lauert da, wo eine Klasse Methoden überschreibt, die der super-Konstruktor verwendet: Nämlich immer da, wo die überschriebene Methode erst in der abgeleiteten Klasse deklarierte und initialisierte Objektvariablen referenziert. Die Methode wird aufgerufen, bevor die referenzierten Objektvariablen überhaupt instanziiert wurden. Nur die Deklarationen sind der VM beim Aufruf des Konstruktors bereits bekannt, dafür sorgt der Compiler.

Viel Spaß beim Coden,
Jürgen
 
Danke schön!

Bin zwar nicht überall voll gestiegen, werde es mir aber später nochmals reinziehen, vielleicht klappts dann besser! 🙂
Vielen Dank für die ausführlichen Antworten!
Phaxx (ehemals Gast)
 
Phaxx hat gesagt.:
Habe ich das jetzt richtig verstanden: Instanzvariabeln sind solche, welche in jedem Objekt instanziert werden. Das Gegenstück dazu sind die statischen Variabeln, welche Klassenweit gelten...?
Richtig

Phaxx hat gesagt.:
Einerseits sehe ich das voll ein, dass man die Werte in den Konstruktoren zuweist. Andererseits habe ich den folgenden Gedanken:
Wenn ich eine Instanzvariable habe, welcher in allen Konstruktoren den selben Startwert zugewiesen würde, macht es dann nicht Sinn, diese in der Klasse zu setzen, um den Code um einige Linien zu verkleinern (angenommen, wir haben viele Konstruktoren). Oder macht dies nicht viel aus?
ich würde immer, wenn man mehrere Konstruktoren hat sie untereinander aufrufen lassen:

Code:
public Test() {
  this(0,0);
}

public Test(int i) {
   this(i,0);
}

public Test(int i, int j) {
  this.i = i;
  this.j = j;
}
 
Status
Nicht offen für weitere Antworten.

Zurück
Oben