Initialisierung Enumuration

Status
Nicht offen für weitere Antworten.
M

MrChance

Gast
Code:
enum Enum { 
  ENUM1, ENUM2, ENUM3; 
  public static int a = 0; 
  public static int b; 

  Enum() { 
    Enum.a++; 
    Enum.b++; 
  } 
} 

public class Class { 
  public static int a = 0; 
  public static int b; 

  Class() { 
    Class.a++; 
    Class.b++; 
  } 

  public static void main(String[] args) {  
    new Class();  
    new Class();  
    new Class(); 

    System.out.println("a=" + Class.a + " b=" + Class.b); 
    System.out.println("a=" + Enum.a  + " b=" + Enum.b); 
  } 
}

Raus kommt:
3 3
0 3

Wieso ???
 

Zunera

Aktives Mitglied
Hi,

eins vorweg: Bei nicht initialisierten Variablen kann man nicht 100% sicher sein, was für einen Wert diese hat - wie in diesem Fall beidesmal b.
Die erste Zeile ist ja soweit klar: 3x new Class() Aufrufe - also dreimal a++ und b++ ergibt "3 3", da Class.b == 0 (davon kann man aber nicht ausgehen).
Die zweite Zeile ist auch erklärbar:
Das Enum.a == 0 ist wieder klar, dass Enum.b == 3 und nicht 0 ist, ist vielleicht überraschend aber nicht sonderlich ;) (siehe erster Absatz) Meine Vermutung, warum Enum.b == 3: ENUM1, ENUM2, ENUM3 werden ja die Werte 0, 1, 2 zugewiesen (a = 0), also wird b = 3 gesetzt (obwohl b ja an sich wenig mit den Ordinalzahlen von dieser Enumklasse zu tun hat). Wenn du zB ENUM3 löschst, erhältst du Enum.b == 2.

Viele Grüße
 
R

Roar

Gast
> eins vorweg: Bei nicht initialisierten Variablen kann man nicht 100% sicher sein, was für einen Wert diese hat - wie in diesem Fall beidesmal b. [...] Class.b == 0 (davon kann man aber nicht ausgehen).
doch schon, nicht initialisierte variablen sind immer null, 0 oder false

> Das Enum.a == 0 ist wieder klar
das is gar nicht klar, der konstruktor wird 3mal aufgerufen darum wird a 3mal inkrementiert genauso wie b. wenn man nachprüft, wird a auch inkrementiert, aber trotzdem beim zugriff 0 ist. warum das so ist würd ich auch gern wissen ???:L
noch merkwürdiger ist, dass a = 3 ist wenn ich wie b das = 0 entferne.

PS: konnte übrigens mit deinem code nen bug entdecken: http://jetbrains.net/jira/browse/IDEA-10642 ;)
 

Zunera

Aktives Mitglied
> eins vorweg: Bei nicht initialisierten Variablen kann man nicht 100% sicher sein, was für einen Wert diese hat - wie in diesem Fall beidesmal b. [...] Class.b == 0 (davon kann man aber nicht ausgehen).
doch schon, nicht initialisierte variablen sind immer null, 0 oder false

Stimmt, da lag ich falsch - hab nochmal gegoogelt und auch entpsrechenden Hinweise für Java gefunden. Hab halt gelernt, niemals Variablen undefiniert zu lassen - vor allem wenn man mit verschiedenen Programmiersprachen arbeitet.

> Das Enum.a == 0 ist wieder klar
das is gar nicht klar, der konstruktor wird 3mal aufgerufen
Nein, der Enumkonstruktor ("new Enum()") wird nirgends aufgerufen!

noch merkwürdiger ist, dass a = 3 ist wenn ich wie b das = 0 entferne.
Wenigstens sieht man an dem gegebenen Beispiel die Verwirrung, die nicht initialisierte Variablen hervorrufen. Ich bleibe also dabei: Variablen immer initialisieren - auch Standardtypen. :toll: :wink:
 
M

MrChance

Gast
... gerade dadurch, dass man die Variable Enuam.a initialisiert, kommt was falsches (bzw. was anderes als bei Class) raus !!!
 
M

MrChance

Gast
... die Variable a wird ja auch hochgezählt .. kann man sich ja ausgeben lassen ... und dann wird es wieder re-initialisiert !
 

Zunera

Aktives Mitglied
doch, natürlich, 3 mal für jedes Enum element 1 mal, weshalb sollte b wohl 3 sein
mmmhhhh... stimmt auch wieder ???:L Danke fürs Augenöffnen :shock: :wink:

Zumindest glaube ich jetzt zu wissen, warum Enum.a == 0: Beim initialisieren von Enum werden erst ENUM1, ENUM2, ENUM3 per Konstruktor initialisiert, erst danach kommt "public static int a = 0;". a ist schon bekannt, nur wird scheinbar erst später die Zuweisung ausgeführt. Vermutlich rührt daher auch der Bug?!

edit: mein Beitrag -> etwas spät - danke für die interessanten Ausführungen, mit Enum bin ich nun etwas - wenn auch nicht gänzlich - warm
 
M

MrChance

Gast
Code:
	enum Enum { 
		  ENUM1, ENUM2, ENUM3; 
		  public static int a = -1 ; 
		  public static int b; 
		  
		  Enum() { 
		    Enum.a++; 
		    Enum.b++; 
		    System.out.println("Enum.a=" +Enum.a );
		  } 
		} 

	public class Class { 
		  public static int a = -1; 
		  public static int b; 

		  Class() { 
			  Class.a++; 
			  Class.b++; 
			  System.out.println("Class.a=" + Class.a);
		  } 

		  public static void main(String[] args) {  
		    new Class();  
		    new Class();  
		    new Class(); 

		    System.out.println("a=" + Class.a + " b=" + Class.b); 
		    System.out.println("a=" + Enum.a  + " b=" + Enum.b); 
		  } 
		}

=> Die Frage ist also: Wieso wird bei der Klasse mit dem Initialwert gearbeitet, während beim Enum mit dem Defaultwert gearbeitet wird ?
 
R

Roar

Gast
weil bei der klasse die statischen felder vor dem konstruktor initialisiert werden und bei dem enum alles statische nach der instantiierung ausgeführt wird.
 
G

Gast

Gast
Deine Antwort steckt in meiner Frage bereits drin ;-) Meine Frage anders formuliert: Wieso wird es unterschiedlich gehandhabt ?
 
R

Roar

Gast
ich vermute mal, damit die enum konstanten initialisiert sind, bevor irgendwie auf sie zugegriffen wird, z.b. im static block.
mich wunderts überhaupt, dass das so kompiliert wird wie du geschrieben hast, wenn a Object wär, ginge das nicht. würde mich nich wundern, wen ndas nen compiler bug is, jedenfalls ists bescheuert ;)
 
M

MrChance

Gast
Vielen Dank auch an euch ! Jetzt ist mir einiges klarer...

Das mit der Objektreferenz hättest Du aber nicht erwähnen sollen !! ;-)
 
Status
Nicht offen für weitere Antworten.

Ähnliche Java Themen

Neue Themen


Oben