# Vererbung von Attributen und Methoden, Verständnisproblem



## ThomasKo (18. Jan 2005)

Hallo,

ich habe ein ein Verständnisproblem bzgl. der Vererbung von Attributen und Methoden in folgendem kleinen Beispiel:


```
class A
{
	public int attr = 1;
	
	public void ausgabe()
	{
		System.out.println("Ausgabe Klasse A");
	}		
}

class B extends A
{
	public int attr = 2;
	
	public void ausgabe()
	{
		System.out.println("Ausgabe Klasse B");
	}
	
	public static void main(String args[])
	{
		A meinB = new B();
		
		System.out.println(meinB.attr);
		meinB.ausgabe();
	}				
}
```
AUSGABE:

1
Ausgabe Klasse B

###########################################################

Nun hoffe ich, dass ihr mir bei folgenden Fragen weiterhelfen könnt, mein Tutor an der FH konnte es nämlich leider auf die Schnelle nicht 

Das Programm gibt korrekt "Ausgabe Klase B" aus, da die Methode ausgabe in der abgeleiteten Klasse überschrieben wird. Warum aber wird der Wert von attr aus der Oberklasse ausgegeben, obwohl die Variable auch überschrieben wird ? Ich habe eigentlich in der Vorlesung gelernt, dass Attributwerte überhaupt nicht vererbt werden sollten...

Wenn ich 
A meinB = new B();
in
B meinB = new B();
ändere ist die Ausgabe für mich verständlicher, nämlich:

2
Ausgabe B

wie ich es eigentlich auch im eigentlichen Beispiel erwartet hatte. Da B von A abgeleitet ist sollte es doch eigentlich problemlos möglich sein ein Objekt von B in einer Variable vom Typ A zu speichern, oder nicht ?

Bin für Hilfe dankbar 

MfG

Thomas


----------



## foobar (18. Jan 2005)

> ch habe eigentlich in der Vorlesung gelernt, dass Attributwerte überhaupt nicht vererbt werden sollten...


Dann hast du wohl was falsch verstanden.



> wie ich es eigentlich auch im eigentlichen Beispiel erwartet hatte. Da B von A abgeleitet ist sollte es doch eigentlich problemlos möglich sein ein Objekt von B in einer Variable vom Typ A zu speichern, oder nicht ?


Jepp, aber warum probierst du es nicht einfach aus.


----------



## Gast (18. Jan 2005)

Hi Thomas,

wie du schon sagtest, man sollte Attribute nicht nochmal in einer abgeleiteten Klasse redefinieren. Ist trotzdem ein komisches Verhalten, das ich leider auch nicht erkären kann. Ich habe aber ein bisschen herumgespielt.

1. Versuch: beide Variablen als private deklariert und in Klasse A getter und setter eingeführt.


```
public class A {
  public int getAttr() {
    return attr;
  }

  public void setAttr(int attr) {
    this.attr = attr;
  }

  private int attr = 1;

  public void ausgabe()
  {
     System.out.println("Ausgabe Klasse A");
  }
}
```

Ergebnis:

1
Ausgabe Klasse B


2. Versuch: Danach die getter- und setter-Methoden in Klasse B überschrieben.


```
public class B extends A {
  private int attr = 2;

  public int getAttr() {
    return attr;
  }

  public void setAttr(int attr) {
    this.attr = attr;
  }

  public void ausgabe()
  {
     System.out.println("Ausgabe Klasse B");
  }

  public static void main(String args[])
  {
     A meinB = new B();

     System.out.println(meinB.getAttr());
     meinB.ausgabe();
  }
}
```

Ergebnis:

2
Ausgabe Klasse B


Warum es dann plötzlich geht keine Ahnung.

Gruß

Wolfgang


----------



## Guest (18. Jan 2005)

foobar hat gesagt.:
			
		

> > wie ich es eigentlich auch im eigentlichen Beispiel erwartet hatte. Da B von A abgeleitet ist sollte es doch eigentlich problemlos möglich sein ein Objekt von B in einer Variable vom Typ A zu speichern, oder nicht ?
> 
> 
> Jepp, aber warum probierst du es nicht einfach aus.



ich habe es natürlich vorher ausprobiert, und das Speichern ist ja auch möglich.Das "problemlos" bezog sich auf das mir nicht erklärliche Verhalten.


----------



## ThomasKo (19. Jan 2005)

Danke noch einmal für die bisherigen Antworten!

Was die Vererbung von Variablenwerten anging lag ich falsch, da bin ich mir mitlerweile sehr sicher 

Was die Problematik angeht bin ich nun auch ein ganzes Stück weiter und für diejenigen die es interessiert hier ein Zitat von einer Homepage der Uni-Köln:

5    Verdecken von Attributen
Man vermeide, in abgeleiteten Klassen neu eingeführte Attribute mit solchen Namen zu belegen, die bereits in der Oberklasse vorhanden sind und damit per Vererbung auch in der abgeleiteten Klasse vorhanden sind.
Technisch ist das aber möglich. In Methoden der abgeleiteten Klasse verdeckt dann das neue Attribut das ererbte Attribut, man greift stets auf das Attribut der abgeleiteten Klasse zu.
Außerhalb der abgeleiteten Klasse kann es beim Attributzugriff durchaus dazu kommen, daß man das Attribut der Basisklasse erwischt! Der Attributzugriff wird aus Effizienzgründen in Java und C++ nämlich nicht so aufwendig implementiert wie der Methodenzugriff. Es wird einfach nur der statische Typ der Referenz genommen, und das Attribut aus der dem statischen Type entsprechenden Klasse..


----------

