PDA

Archiv verlassen und diese Seite im Standarddesign anzeigen : Doppelte Variablennamen



davidh38
07-04-2007, 06:05
Warum zeigt der Compiler folgendem Quelltext keinen FEhler?

class irgendwie {

int a;
{int a;}

....

Wenn ich das ganz aber ein eine statisch Funktion schreiben schon, warum?

public static void main (String [] args){
int b;
{int b;} // Compilerfehler

Liberty
08-04-2007, 15:28
Moin,

sorry für die späte Antwort, ich musste erstmal selbst die Bücher wälzen, wie diese Konstrukte richtig heißen...



class irgendwie {

int a; <-- Das hier ist ein normales Feld

{int a;} <-- Das ist ein Instance Initializer (http://java.sun.com/docs/books/jls/third_edition/html/classes.html#246032)


Die Variable in den {}-Klammern ist eine lokale Variable in einem "namenlosen" Codeblock, die deshalb nicht mit dem gleichnamigen Feld in der Klasse selbst kollidiert.
Aber ich habe ganz ehrlich keine Ahnung, wann solche Instance/Static Initializer in der Realität eingesetzt werdenl, ich könnte mir nur vorstellen, dass man so Code zusammenfassen kann, der allen Konstruktoren gemein ist.
Ich habe auch (noch) nicht rausfinden können, ob dieser Code vor oder nach dem Constructor ausgeführt wird...

Aber das Dein zweites Beispiel nicht compiliert wird, wundert mich jetzt schon, denn wenn ich diese Defintion (http://java.sun.com/docs/books/jls/third_edition/html/statements.html#14.2) eines Blocks richtig verstehe, dann sollten die geschweiften Klammern doch einen Gültigkeitsbereich begrenzen, in dem Variablenbezeichnungen redefiniert werden können...
Also wenn mir da einer der anderen Java-Experten nochmal sagen könnte, wo ich etwas falsch verstanden habe, dann wäre das super, danke!

So long,
Liberty

peschmae
08-04-2007, 17:27
Also wieso das mit den Sub-Blocks nicht geht weiss ich auch nicht. Da hätten wir mal wieder einen Unterschied zu C/C++ entdeckt :)

Ist wohl einfach weil dumme Leute damit dumme Bugs kreiert haben :D

MfG Peschmä

Waxolunist
08-04-2007, 22:34
Also ich kenn das nur in Form der static-Blocks.


public class TestTool {

static int a = 1;

static {
int a = 2;
System.out.println(a);
}

public static void main (String args[]) {
System.out.println(a);
{
int a = 3;
System.out.println(a);
}
}
}

Output:
2
1
3

Das zweite ist ein namenloses Konstrukt in einer Methode. Die Klammern sind ohne Sinn eigentlich. Wäre int a vor den Klammern noch einmal deklariert, käme ein already defined - Compile-Fehler.
Würde der erste Block ohne static beschrieben sein, würde er auch nicht ausgeführt werden.

Static-Blocks haben durchaus Sinn. Sie sind wie static-Variablen, werden also nur einmal bei der ersten Konstruktion eines Objekts ausgeführt.

mfg, Christian

peschmae
08-04-2007, 22:43
Klar sind die Klammern im konkreten Beispiel ohne Sinn (ausser eben, einen Sub-Block mit eigener Variablengültigkeit zu bilden). Aber denselben Effekt hast du auch bei Subblockklammern die Sinn machen - wie bei for/if's ;)

MfG Peschmä

Waxolunist
09-04-2007, 10:18
Egal, wie, dieser Code würde keiner Qualitätsprüfung bei uns in der Firma Stand halten. :)