# frage zu vererbung (super)



## Guest (6. Feb 2008)

hi, ich hab ein paar fragen zur vererbung.

frage 1: werden auch STATISCHE methoden und variablen vererbt?
frage 2: wenn ich eine methode in einer unterklasse überschreibe, und ich möchte nun
aber die ursprüngliche methode der oberklasse benutzen, dann kann ich ja machen:
*super.getName();*
Aber: auf welches Objekt wird dann die getName-Methode der Oberklasse angewandt?

Beispiel: Klasse A hat getName(), Klasse B erbt von A und überschreibt getName()
Klasse C hat nun eine main-methode, und erstellt ein neues Objekt der Klasse B.
Wie kann ich jetzt die getName()-methode der Klasse A aufrufen??

ich dachte erst : *meinObjekt.super.getName(), *aber das geht nicht.

frage 3: wenn ich eine STATISCHE variable geerbt habe (falls das geht) und ich 
überschreibe sie in der unterklasse, wie greife ich dann auf die der oberklasse zu?

frage 4: analog zu prozeduren ( wobei ihr meint sowas gibts nicht, steht
aber so in unserem skript: prozedur = statische funktion, methode = nicht statische funktion)


----------



## Beni (6. Feb 2008)

1. Werden nicht vererbt (im Sinne von: die kannst du nicht überschreiben. Du kannst aber neue Methoden/Variablen mit demselben Namen definieren).
2. Es wird immer die zuletzt definierte Methode genommen (Also in deinem Beispiel immer B.getName()). Von aussen kann man das nicht umgehen.

Wenn du sagen würdest, was du machen willst, könnte man dir vielleicht besser helfen... :wink:


----------



## _fliX (6. Jul 2009)

Hallo zusammen,

hab den Thread über google gefunden. Leider ist die 2. Frage noch nicht richtig beantwortet. Kann das vllt. noch mal wer erläutern? Habe ein ähnliches Beispiel. wenn ich um auf sein Beispiel zurückzukommen in der Klasse C wird das Objekt B erstellt und soll halt die Methode der Superklasse benutzen. wenn ich super.getName() mache bekomme ich: Cannot use super in a static context...

also meine frage ist wie kann ich mit dem objekt der subklasse auf die methode der superklasse zugreifen?


----------



## faetzminator (6. Jul 2009)

Deine Frage wurde mit Punkt 1 beantwortet, statische Methoden sollte man eher als Funktionen bezeichnen, sie sind nicht an ein Objekt sondern an eine Klasse gebunden. Wenn du da "static a() {}" hast, kannst du statt B.a() einfach A.a() aufrufen.


----------



## _fliX (6. Jul 2009)

naja bei meinem test programm ist aber keine methode als statisch deklariert


----------



## SlaterB (6. Jul 2009)

wenn du ein Objekt B hast, dann kannst du von Klasse C oder statischen Methoden aus auf keine Weise Methoden von A aufrufen, die B überschreibt,

nur B selber kann super benutzen, z.B.

```
class B{

@Override
public String getName() {.. }


public String getSuperName() {
return super.getName();
}
```

wenn B aber nicht so freundlich ist, dann ist die Vererbungsmauer hier undurchdringlich


----------



## _fliX (6. Jul 2009)

ich paste mal mein beispiel evtl. verstehe ich es dann:


```
public class Arbeiter {
	
//Attribute
	int x;
	int y;

//Methoden
	
	public void test(){
		x = 12;
		System.out.println("Arbeiter "+x);
	}
}


public class Azubi extends Arbeiter {
	
//Methoden
	
	public void test(){
		x = 30;
		System.out.println("Arbeiter "+x);
	}
}


public class App {

	/**
	 * @param args
	 */
	public static void main(String[] args) {
		
		Arbeiter [] test = new Arbeiter[2];
		test[0] = new Azubi();
		test[1] = new Arbeiter();
		
/*		for (int i = 0; i<test.length; i++){
			test[i].test();
			}*/
			
		System.out.println(test[0]);
		System.out.println(test[1]);
	}
}
```

In der Class App soll dann einfach für das Objekt Azubi die Methode test von Arbeiter aufgerufen werden. (Also so, dass x = 30 ist und nicht 12). Das ist nur ein Beispiel zum Verständnis... Mir ist klar, dass ich die Variable auch anders ändern kann


----------



## faetzminator (6. Jul 2009)

Aber irgendwo versuchst du hier von einer statischen Methode auf eine (statische oder nicht statische) Methode der Superklasse zuzugreifen, das sagt zumindest "Cannot use super in a static context..."


----------



## SlaterB (6. Jul 2009)

meine Antwort hat doch alles geklärt


----------



## eRaaaa (6. Jul 2009)

_fliX hat gesagt.:


> In der Class App soll dann einfach für das Objekt Azubi die Methode test von Arbeiter aufgerufen werden. (Also so, dass x = 30 ist und nicht 12). Das ist nur ein Beispiel zum Verständnis...



wenn du das möchtest, solltest du die test-methode in der azubi klasse nicht überschreiben, denn das widerspricht sich ja irgnediwe 
du könntest sie einfach weglassen, dann erbt sie sie von arbeiter. ansonsten könntest du halt noch eine methode in azubi einfügen, die dann expliziet super.test(); aufruft...

oder versteh ich das problem gerad falsch ?


----------



## _fliX (6. Jul 2009)

naja es hätte ja auch sein können, dass ich noch andere objekte haben möchte, die dann aber die andere test funktion aufrufen, aber hab nun verstanden, dass die super dann als eine neue methode in azubi gehört 
vielen dank wie immer an alle


----------

