Hi, ich habe hier in meiner Klasse BTFigur 2 static chars die jeweils die Konstanten returnen sollen.
Allerdings sagt er mir hier : The method getAFigur cannot be declared static; static methods can only be declared in a static or top level
type.
Wenn ich die Klasse extern irgendwo ablege gibt es kein Problem diesbezüglich.
Wo ist denn der Fehler ?
Um statische Variablen per Methode zurück zu geben muss die Methode nicht statisch sein. Also entweder static weg von der Methodendeklaration oder die static variablen public /protected machen und einfach per BFFigur.KREUZ ansprechen, so muss keine Instanz von BFFigur zwangsweise existieren. (Methode 2 nur wenn die entsprechenden Variablen auch final sind).
mhn ja doch eindeutig... man kann anscheinend keine statischen methoden in inneren klassen machen, wenn diese nicht statisch sind... ist mir zwar neu, arbeite aber auch ganz selten mit inneren klassen...
Trifft übrigens nicht nur auf Methoden zu:Ich wollte mir auch erst kürzlich ein paar statische Konstanten in ner inner class definieren. Selber Fehler. Fand ich dann auch ziemlich doof dass das nicht geht. Hat dafür jemand eine Erklärung?
Nicht statische innere Klassen existieren nur, wenn es eine Instanz der äußeren Klasse gibt. Um auf statische Felder einer Klasse zuzugreifen, muss diese aber existieren. Da das bei der genannten Konstellation nicht garantiert ist, geht static eben nicht.
Anders herum gesagt, gibt es die nicht statische innere Klasse mehrmals. Auch so rum wäre ein Zugriff auf statische Felder/Methoden anders als bei einer echten Klasse. Auch das mag ein Grund sein, wieso es nicht geht.
Es wird empfohlen, innere Klassen immer static zu machen (z.B. siehe Effective Java von Joshua Bloch).
> Nicht statische innere Klassen existieren nur, wenn es eine Instanz der äußeren Klasse gibt.
dann kann man genauso wieder fragen warum das so ist, dass die Objekte von den umgebenden Instanzen abhängen ist ja klar,
warum aber die Klasse?
zudem:
Java:
publicclassTest{publicstaticvoidmain(String[] args){Class c =Test.Inner.class;System.out.println(c);// schon vor Objekterzeugung daTest a =newTest();Test b =newTest();Inner d = a.newInner();Inner e = b.newInner();System.out.println(d.getClass()== e.getClass());// true}classInner{}}
Dieses Konstrukt gibt es, weil es mit nicht statischen inneren Klassen möglich ist, direkt auf die Instanzvariablen der äußeren Klasse zuzugreifen. Das geht nur, wenn es den Bezug/die Abhängigkeit von einer Instanz der äußeren Klasse gibt.
siehe auch mein edit im vorherigen Posting,
ich weiß nicht was genau du meinst aber die Existenz einer Klasse (nicht der Objekte) kann eigentlich nicht in Frage stehen,
und wenn es die Klasse gibt, dann auch die statischen Konstanten?
Krass, ich hab's grad nochmal getestet weil ich ja in Erinnerung hatte dass das eben nicht ging bei mir. Und jetzt check this shit:
Java:
publicclassClazz{classInner{privatestaticfinalint i =10;// no problem}}
Geht tatsächlich, wie du sagst. Aber was ich damals hatte war das hier:
Java:
publicclassClazz{classInner{privatestaticfinalColor c =Color.RED;}}
Und DAS gibt: The field c cannot be declared static; static fields can only be declared in static or top level types
ABER:
Java:
publicclassClazz{classInner{privatestaticfinalString c ="das hier geht auch!!";}}
Hab grad paar Typen durchprobiert. Meine erste Vermutung ist jetzt dass sich diese Konstanten auch nur auf diejenigen Typen beschränken, die im java.lang package liegen?!
in der Tat sehr merkwürdig, bei String ist null wiederum ein Problem..,
außer String als halb-primitiver Typ habe ich noch gar keine andere Klasse geschafft,
mit Object oder Comparable als Variablen-Typ ließen sich ja auch beliebige Objekt reinschmuggeln
Hast wohl Recht, ich hab's auch nur mit nem String hinbekommen bisher. Arrays gehen auch nicht.
PS: Aha, Strings geht wohl nur wg. dem constant Pool. Denn mittels new-Erzeugung geht's auch mit Strings nicht. Also nur String Literale und primitive Typen, wie's aussieht. Merkwürdig ist dass die Compiler Meldung dann ja eigentlich schlicht falsch ist. Steht darüber denn nix in der JLS?