Du verwendest einen veralteten Browser. Es ist möglich, dass diese oder andere Websites nicht korrekt angezeigt werden. Du solltest ein Upgrade durchführen oder ein alternativer Browser verwenden.
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 ?
lg
Java:
class BTFigur{
final static char KREUZ='x';
final static char KREIS='o';
final static char LEER='.';
boolean aOderB;
int zeile,spalte;
BTFigur(boolean aOderB, int zeile,int spalte){
this.aOderB =aOderB;
this.zeile= zeile;
this.spalte=spalte;
}
boolean istAFigur(){
return this.aOderB;
}
boolean istBFigur() {
return !this.istAFigur();
}
int getZeile() {
return this.zeile;
}
int getSpalte() {
return this.spalte;
}
static char getAFigur() {
return KREUZ;
}
static char getBFigur() {
return KREIS;
}
char getLeer(){
return LEER;
}
}
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:
public class Test {
public static void main(String[] args) {
Class c = Test.Inner.class;
System.out.println(c); // schon vor Objekterzeugung da
Test a = new Test();
Test b = new Test();
Inner d = a.new Inner();
Inner e = b.new Inner();
System.out.println(d.getClass() == e.getClass()); // true
}
class Inner {
}
}
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:
public class Clazz {
class Inner{
private static final int i = 10; // no problem
}
}
Geht tatsächlich, wie du sagst. Aber was ich damals hatte war das hier:
Java:
public class Clazz {
class Inner{
private static final Color 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:
public class Clazz {
class Inner{
private static final String 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?