Statische Variable in Oberklasse, so dass alle abgeleiteten Klassen eine eigene Version haben
-
Ist es möglich, in einer Oberklasse eine statische Variable zu haben, die von den abgeleiteten Klassen geerbt wird, so dass jede abgeleitete Klasse ihre eigene Version der Variable hat?
Also ich hab beispielsweise eine Basisklasse "Basis" mit einem statischen Wert "Variable". Von der Klasse leiten "Abgeleitet1" und "Abgeleitet2" ab.
Ich möchte es nun so haben, dass
Basis.Wert
Abgeleitet1.Wert
Abgeleitet2.Wert
drei unterschiedliche Variablen sind.Es sind keine Variablen, die zu einem bestimmten Objekt gehören. Es müssen schon objektübergreifende statische Variablen sein.
Und ich möchte sie auch möglichst nicht in jeder Klasse einfach manuell neu definieren. Es soll so sein, dass die Deklaration in Basis dafür sorgt, dass alle abgeleiteten Klassen jeweils automatisch eine eigene Instanz der Variable bekommen. Wenn ich also zum Beispiel eine Funktion habe, die in Basis deklariert wurde und die auf Wert zugreift, dann soll der Aufruf der Funktion in einer der abgeleiteten Klassen mit dem jeweiligen Wert der abgeleiteten Klasse arbeiten.Beispiel: Ich hab eine Klasse Lebewesen, von der leiten sich die Klasse Mensch und Hund ab. Die statische Variable heißt WissenschaftlicherName. (Ja, ich weiß, das wäre normalerweise eigentlich eine unveränderliche Konstante, keine Variable. Aber sagen wir mal, sie muss im Quellcode veränderbar sein.) Innerhalb von Menschen ist dieser Name gleich, deshalb ist es keine objektbezogene Variable, sondern eine statische, die allgemein für die ganze Klasse gilt. Aber zwischen Mensch und Hund gibt es da natürlich Unterschiede.
Ist so etwas möglich und wenn ja, wie?
-
Direkt ist sowas nicht möglich. Indirekt könntest Du so etwas machen (ohne den Sinn zu hinterfragen):
public class LebewesenTest { public static void main(String[] args) { Hund hund = new Hund(); Mensch mensch = new Mensch(); System.out.println("hund: " + hund.getRasse()); System.out.println("mensch: " + mensch.getRasse()); mensch.setRasse("Homo Verblödus"); System.out.println("mensch: " + mensch.getRasse()); } } abstract class Lebewesen { protected static final Map<Class<?>, String> RASSE_MAP = new HashMap<Class<?>, String>(); public String getRasse() { return RASSE_MAP.get(getClass()); } public void setRasse(String rasse) { RASSE_MAP.put(getClass(), rasse); } } class Mensch extends Lebewesen { static { RASSE_MAP.put(Mensch.class, "Homo Sapiens"); } } class Hund extends Lebewesen { static { RASSE_MAP.put(Hund.class, "Bello Fellus"); } }