statische Attribute: Vererbung und Zugriff darauf

Status
Nicht offen für weitere Antworten.

automatix

Aktives Mitglied
Hallo!

Ein Verständnisproblem...

Es gibt drei Klassen: MyClass, MySubClass und MyChildClass. Dabei ist MyClass die direkte Basisklasse für die anderen zwei:
Code:
public class MyClass {
	
	private static int counter;
	
	public static void setCounter(int counter) {
		MyClass.counter = counter;
	}
	
	public static int getCounter() {
		return counter;
	}
	
}
Code:
public class MySubClass extends MyClass {
	
}
Code:
public class MyChildClass extends MyClass {
	
}
D.h. alle drei Klassen haben das Attribut counter -- die Basisklasse von sich aus und die abgeleiteten erben es.

Was ich nicht verstehe, ist, warum beim Verändern des Wertes des Attributs counter einer (egal welcher von den drei) Klasse, sich auch die Werte der counter-Attribute der restlichen zwei Klassen ändern.

Code:
public class Main {
	
	public static void main (String[] args) {
		
		MyClass myClass = new MyClass();
		MySubClass mySub = new MySubClass();
		MyChildClass myChild = new MyChildClass();
		
		myClass.setCounter(123);
		
		System.out.println("MyClass.counter = " + MyClass.getCounter());
		System.out.println("MySubClass.counter = " + MySubClass.getCounter());
		System.out.println("MyChildClass.counter = " + MyChildClass.getCounter());
		
		MySubClass.setCounter(456);
		
		System.out.println("MyClass.counter = " + MyClass.getCounter());
		System.out.println("MySubClass.counter = " + MySubClass.getCounter());
		System.out.println("MyChildClass.counter = " + MyChildClass.getCounter());
		
		MyChildClass.setCounter(789);
		
		System.out.println("MyClass.counter = " + MyClass.getCounter());
		System.out.println("MySubClass.counter = " + MySubClass.getCounter());
		System.out.println("MyChildClass.counter = " + MyChildClass.getCounter());
		
	}

}
MyClass.counter = 123
MySubClass.counter = 123
MyChildClass.counter = 123
MyClass.counter = 456
MySubClass.counter = 456
MyChildClass.counter = 456
MyClass.counter = 789
MySubClass.counter = 789
MyChildClass.counter = 789
Kann jemand sagen, warum alle drei Attribute nicht dasgleiche, sondern dasselbe referenzieren?

Danke.
 

tfa

Top Contributor
automatix hat gesagt.:
D.h. alle drei Klassen haben das Attribut counter -- die Basisklasse von sich aus und die abgeleiteten erben es.
Nein, tun sie nicht.
Statische Attribute werden niemals vererbt. Die Subklassen können zwar ohne Qualifizierung auf die statischen Methoden der Superklasse zugreifen, aber es ist immer MyClass.getCounter(). Das ist meiner Meinung nach eine kleine Designschwäche von Java. Du solltest deine IDE so einstellen, dass sie hier einen Fehler oder mindestens eine Warnung anzeigt.
 

Landei

Top Contributor
Wenn du willst, dass die Unterklassen "eigene" counter bekommen, gib sie ihnen doch einfach:
Code:
public class MySubClass extends MyClass {
   private static int counter;
   
   public static void setCounter(int counter) {
      MySubClass .counter = counter;
   }
   
   public static int getCounter() {
      return counter;
   }   
}
 

automatix

Aktives Mitglied
Ja, anders wird es wohl nicht gehen. Nur halt doof, dass man dann die setCounter-Methode nicht einfach vererben kann, sondern in jeder Unterklasse anpassen muss... Aber das ist offensichtlich unvermeidlich.
 

Landei

Top Contributor
Genau, aber man kann es zumindest etwas abmildern:

Code:
public class MyClass { 
   
   public static Counter counter = new Counter();
    
   protected static class Counter {
      private int counter; 
    
      public void set(int counter) { 
         this.counter = counter; 
      } 

      public int get() { 
        return counter; 
      } 
   } 
}

public class MySubClass { 
   public static Counter counter = new Counter();
}


MyClass.counter.set(123);
MySubClass.counter.set(456);
 

Leroy42

Top Contributor
tfa hat gesagt.:
Die Subklassen können zwar ohne Qualifizierung auf die statischen Methoden der Superklasse zugreifen, aber es ist immer MyClass.getCounter(). Das ist meiner Meinung nach eine kleine Designschwäche von Java.

:shock: Wieso das denn? ???:L
 

tfa

Top Contributor
Wenn das nicht ginge, hätte automatix z.B. dieses Problem nicht gehabt.
(Was aber ich eigentlich im Kopf hatte, war die Möglichkeit "objekt.statischeMethode()" zu schreiben, hat aber mit diesem Problem nicht viel zu tun.)
 

automatix

Aktives Mitglied
Eine weitere Frage zum Thema... Bei der Konstellation, wenn in allen drei Klassen das Attribut counter definiert ist, liefert die Methode getCounter() immer den Wert des Attributs counter der Basisklasse zurück. Erst wenn man die Methode in den abgeleiteten Klassen überschreibt, kriegt man den "richtigen" Counter zurückgeliefert... Warum?

P.S.
Landei hat gesagt.:
*doppeldoppelpostpost*
"doppeldoppelpostpost" ist meiner Meinung nur dann problematisch, wenn man mehrmals dasgleiche innnerhalb eines Forums schreibt.
 

tfa

Top Contributor
Weder statische Felder noch statische Variablen werden vererbt. Die getCounter-Methode ist fest an die counter-Variable der entsprechenden Klasse gebunden. Über die Unterklasse kannst du die Methode zwar (syntaktisch) aufrufen, aber intern wird daraus ein "Oberklasse.methode()" gemacht. Wie gesagt, ein kleines Problem.
 

Soi

Mitglied
Landei hat gesagt.:
Code:
public class MyClass { 
   
   public static Counter counter = new Counter();
    
   protected static class Counter {
      private int counter; 
    
      public void set(int counter) { 
         this.counter = counter; 
      } 

      public int get() { 
        return counter; 
      } 
   } 
}

public class MySubClass extends MyClass { 
   public static Counter counter = new Counter();
}


--> public class MySubClass extends MyClass
 

Landei

Top Contributor
Wenn sie nicht protected wäre, könnte MySubClass ja kaum eine neue Instanz erzeugen, gell?
Und wozu das gut sein soll ist ja wohl klar: Statt den Code mit dem set- und get-Methoden in jeder Unterklasse zu wiederholen (wie in meinem ersten Beispiel), steckt er jetzt in einer innerhalb der Vererbungshierarchie wiederverwendbaren Klasse.
 
Status
Nicht offen für weitere Antworten.
Ähnliche Java Themen
  Titel Forum Antworten Datum
B Attribute eines Objekts einer Klasse durch statische Methode einer 2. Klasse ändern? Java Basics - Anfänger-Themen 32
S Zufallszahl (Statische Attribute und Methoden) Java Basics - Anfänger-Themen 10
M Wann statische Methoden/Attribute? Java Basics - Anfänger-Themen 2
V OOP Statische Klassen-Attribute vererben Java Basics - Anfänger-Themen 4
A Stilfrage: statische Methoden und Attribute auf jeden Fall verhindern? Java Basics - Anfänger-Themen 5
N Unterschied statische Attribute u. Methoden <-> objekt Java Basics - Anfänger-Themen 4
J Die statische Main-Methode ändert Instanzvariable? Java Basics - Anfänger-Themen 10
C Größte Zahl aus einem Array ermitteln(als statische Methode) Java Basics - Anfänger-Themen 31
M Warum dürfen Objekte einer Klasse auf statische Variablen dieser Klasse referenzieren? Java Basics - Anfänger-Themen 10
V Variablen statische Variable einer Objektvariable zuordnen Java Basics - Anfänger-Themen 3
S Klassen statische Objekterzeugung vor Konstruktoraufruf??? Java Basics - Anfänger-Themen 6
Queiser Nicht statische Klassen Java Basics - Anfänger-Themen 6
B Statische Methode return funktioniert nicht. Java Basics - Anfänger-Themen 19
C nicht statische Methoden Java Basics - Anfänger-Themen 4
D statische generische Methoden Java Basics - Anfänger-Themen 3
D Statische Variablen/Methoden Java Basics - Anfänger-Themen 3
N Auf statische Methode zugreufen Java Basics - Anfänger-Themen 9
R Methoden Nicht statische Methode aus Main aufrufen Java Basics - Anfänger-Themen 2
F Privater Konstruktor und statische Methoden Java Basics - Anfänger-Themen 4
S ActionListener und Statische Variablen Java Basics - Anfänger-Themen 4
D Statische Objekte mit variablem Parameter Java Basics - Anfänger-Themen 1
K Wieso muss man finale statische Variablen sofort oder eben im Konstruktor initialisieren? Java Basics - Anfänger-Themen 2
F Statische Klasse => Flaschenhals? Java Basics - Anfänger-Themen 10
T Statische Arrays von Objekten Java Basics - Anfänger-Themen 2
S Java Fragen Konstruktor & Statische Methoden Java Basics - Anfänger-Themen 4
B Java Programm ohne statische Main Methode aufrufen Java Basics - Anfänger-Themen 5
S Datentypen nicht lineare STATISCHE Datenstruktur? Java Basics - Anfänger-Themen 10
E statische Variable ändert sich Java Basics - Anfänger-Themen 7
A Statische Variable in Methoden Java Basics - Anfänger-Themen 7
P Klassen statische oder dynamische(?) Klasse Java Basics - Anfänger-Themen 3
A Nicht-statische Methode in einer statischen aufrufen Java Basics - Anfänger-Themen 10
M Statische Methoden in Interface/Abstrakte Klasse Java Basics - Anfänger-Themen 6
J statische Methoden auf eine LinkedList initialisieren? Java Basics - Anfänger-Themen 5
A statische Arraylist Java Basics - Anfänger-Themen 6
Q Variablen Statische Variablen Java Basics - Anfänger-Themen 8
J Unterschied zwischen statische und nicht statische Methoden? Java Basics - Anfänger-Themen 14
K Statische Bindung Java Basics - Anfänger-Themen 6
B dynamische/statische Typen Java Basics - Anfänger-Themen 2
L Methoden Auf statische Methode einer anderen Klasse zugreifen, die Array zurückgibt Java Basics - Anfänger-Themen 3
S statische Methode nebenläufig Java Basics - Anfänger-Themen 2
R Aufruf statische Methode Java Basics - Anfänger-Themen 7
M Statische Methoden Java Basics - Anfänger-Themen 22
C Relativer Pfad - Statische Methode Java Basics - Anfänger-Themen 6
A Statische Methode "vererben" - Zwang durch annotation processor Java Basics - Anfänger-Themen 10
sqsh statische jlabels dynamisch verwalten Java Basics - Anfänger-Themen 2
S Statische Klassen/ Singleton Java Basics - Anfänger-Themen 13
E Statische Member können nicht vererbt werden? Java Basics - Anfänger-Themen 10
F Generische Typen auch für statische Methoden? Java Basics - Anfänger-Themen 13
B statische Variable Java Basics - Anfänger-Themen 10
M Statische und nicht-statische Funktionen: Desktop.browse(uri); Java Basics - Anfänger-Themen 4
A Stilfrage: statische Variable mit Instanz der gleichen Klasse Java Basics - Anfänger-Themen 8
H Statische generische Methode Java Basics - Anfänger-Themen 2
hdi Observer als statische Klasse ? Java Basics - Anfänger-Themen 2
hdi statische synchronisation Java Basics - Anfänger-Themen 6
G statische ArrayList? Java Basics - Anfänger-Themen 8
K Statische Variablen von Objekten im Array Java Basics - Anfänger-Themen 15
K nicht-statische Methode aufrufen Java Basics - Anfänger-Themen 3
S statische variable initialisieren mit exception Java Basics - Anfänger-Themen 2
G statische Variable zugreifen bzw. setzen Java Basics - Anfänger-Themen 6
T in statischem Kontext auf nicht statische Variable beziehen Java Basics - Anfänger-Themen 5
M Statische Funktion Java Basics - Anfänger-Themen 2
M öffentliche nicht-statische Funktion fremder Klasse ausführn Java Basics - Anfänger-Themen 16
C args[] als statische Variablen speicher oder wie? Java Basics - Anfänger-Themen 12
P nicht statische methode instantiieren Java Basics - Anfänger-Themen 7
H statische methoden und sichtbarkeit Java Basics - Anfänger-Themen 13
nadoria statische Methoden (Klassenmethoden) Java Basics - Anfänger-Themen 3
K statische variablen und methode Java Basics - Anfänger-Themen 3
H Was ist nocheinmal eine statische Klasse? Java Basics - Anfänger-Themen 6
G Statische Methoden? Java Basics - Anfänger-Themen 2
kb statische methoden und throws exception Java Basics - Anfänger-Themen 2
H statische, dynamischer Typ von Variablen Java Basics - Anfänger-Themen 1
M Konstruktor eine statische Methode? Java Basics - Anfänger-Themen 9
H statische,dynamische Bindung Java Basics - Anfänger-Themen 4
O nicht-statische Inhalte auf statische Inhalte verweisen Java Basics - Anfänger-Themen 19
M wann statische klassen? Java Basics - Anfänger-Themen 14
U statische Variablen Java Basics - Anfänger-Themen 12
F Statische Methode - Nicht Statische Methode Java Basics - Anfänger-Themen 10
S Statische Felder - statische Methoden Java Basics - Anfänger-Themen 2
D Statische und Nicht-Statische Methoden Java Basics - Anfänger-Themen 7
K Statische Methoden!? Java Basics - Anfänger-Themen 8
T Standardkonstruktor, Attribute initialisieren Java Basics - Anfänger-Themen 5
K wie kann ich alle Attribute von dem Objekt(pagode) ausgeben lassen ? Java Basics - Anfänger-Themen 3
S Attribute zurücksetzen? Java Basics - Anfänger-Themen 2
K Sichtbarkeit protected: Attribute trotzdem aufrufbar. Java Basics - Anfänger-Themen 4
G Welche Attribute kommen in den Konstruktor? Java Basics - Anfänger-Themen 5
X Wie erreiche ich, dass ein Robot weitere Attribute hat, die nicht materialisiert sind, sondern nur über get/ set-Methoden simuliert sind? Java Basics - Anfänger-Themen 1
M Wie können Klassen nicht-materialisierte Attribute haben, die nur über get/ set-Mehoden simuliert sind? Java Basics - Anfänger-Themen 6
B Static Attribute in einer Klasse, wie geht das? :O Java Basics - Anfänger-Themen 19
O Attribute die Methoden zählen Java Basics - Anfänger-Themen 5
L Attribute aus Klasse in berechnungs Methode übergeben Java Basics - Anfänger-Themen 1
Gaudimagspam Attribute einfügen private Java Basics - Anfänger-Themen 3
J final attribute erben Java Basics - Anfänger-Themen 2
T Vererbung Verschiedene Attribute für vererbte Klassen Java Basics - Anfänger-Themen 4
B Infos zu Attribute in einer Klasse speichern Java Basics - Anfänger-Themen 3
S Objekt-Attribute "variabel" gestalten Java Basics - Anfänger-Themen 10
R Attribute mehrerer Objekte ausgeben Java Basics - Anfänger-Themen 3
D Abstrakte Klasse, Konstruktorkette, Attribute setzen Java Basics - Anfänger-Themen 12
L Zugriff auf Attribute eins Objekts über ActionListener Java Basics - Anfänger-Themen 4
F Attribute bei Objektorientierter Programmierung Java Basics - Anfänger-Themen 11
C unverständlicher Code Attribute ohne Datentyp, wie geht das? Java Basics - Anfänger-Themen 8

Ähnliche Java Themen

Neue Themen


Oben