OOP Vererbung und Sichtbarkeit

  • Themenstarter Themenstarter C_A
  • Beginndatum Beginndatum
C

C_A

Gast
Hallo,

ich mache offensichlich einen Gedankenfehler. Es geht um die Sichtbarkeit private. Ich habe bei Head-first "Java" gelesen: "private Member werden nicht geerbt": S. 180, 1. Auflage, 3. Nachdruck.

Es ist doch offensichtlich möglich, eine Klasse zu deklarieren, die in etwas so aussieht:
Java:
public class Mensch
{
      private String vorname;
      // ...
      public String getVorname()
      {
            return vorname;     
      }
}

Hieraus erstelle ich eine Unterklasse:
Java:
public class Student extends Mensch
{
      // ...
}

Die Testklasse wirft problemlos aus:
Java:
public class Test
{
     // ....
     public static void main[String[] args]
     {
          Student studi = new Student();
          System.out.println(studi.getVorname()); 
      }
}

Die Erfahrung zeigt, dass private Instanzvariablen vererbt werden. Dennoch scheue ich mich, den Text von head-first als "unrichtig" zu deklarieren, sondern gehe erstmal davon aus, dass ich einen Fehler mache. Aber wo?
 
kein Fehler.

protected und public Instanzvariablen können ohne Probleme angesprochen werden.

objekt.instanzvariable= blabla;

bei private instanzvariablen brauchst du aber eine getter/setter Methode, da eine private Methode implizit vererbt wird, also nur durch setter getter Methode verfügbar ist.
 
Okay, danke erstmal. Mir stört die Radikalität der Aussage im Buch - ich lese es so, dass private Instanzvariablen GAR NICHT vererbt werden. Und genau das passiert doch ... bzw. nicht .... also, sie werden vererbt!
 
Und genau das passiert doch ... bzw. nicht .... also, sie werden vererbt!

Ich will es mal probieren: Das Buch hat schon Recht, denn das private Member wird nicht vererbt. Halte dir vor Augen, was beim Aufruf von getVorname() passiert.

Beim Anlegen von Student, wird ja auch der Konstruktor von Mensch aufgerufen. Und somit auch eine Mensch-Instanz erzeugt. Machst du nun Student#getVorname so wird dieser Aufruf nach oben weiter gereicht und eigentlich auf dem Mensch-Objekt ausgeführt (da du getVorname ja NICHT überschrieben hast). Du hast auch innerhalb von Student keinen Zugriff auf das Member vorname.

Also wird vorname nicht mit vererbt.

(bitte korrigiert mich, wenn ich falsch liege)
 
Okay, danke erstmal. Mir stört die Radikalität der Aussage im Buch - ich lese es so, dass private Instanzvariablen GAR NICHT vererbt werden. Und genau das passiert doch ... bzw. nicht .... also, sie werden vererbt!

woher denn bitte ? das Buch hat schon recht, die Unterklasse kennt eine private Instanzvariable der Oberklasse NICHT.

Java:
public class Foo {
  private String bar;

  public String getBar() {
     return bar;
  }
}

public class Bla {
  public static void main(String[] args) {
     Foo f = new Foo();
     f.getBar();
  }
}

wuerdest du hier auch sagen, dass Bla die Variable bar kennt ? Ich denke nicht.

Nur weill die Klasse eine öffentliche Methode bereitstellt auf seine Variable zuzugreifen, heisst das nicht, dass andere diese Variable sehen können.

So ist dies auch bei Vererbung. Nur weil die Oberklasse eine Methode bereitstellt, die vererbt wird, hat die Unterklasse keinen Zugriff auf die Variable, da sie NICHT vererbt wird.
 
Hallo, ich würde hier gerne mal einhaken!
In einem Projekt stehe ich derzeit vor der Frage ob ich Instanzvariablen der Oberklasse privat mit Getter / Setter versehen soll oder eben protected an die Unterklasse vererben. Fakt ist, die Variablen werden in der Unterklasse benötigt. Gibt es diesbezüglich gängige Vorgehensweisen und was würdet ihr als guten Stil bezeichnen ?

Vielen Dank im Voraus
geneticZ
 
Hallo, ich würde hier gerne mal einhaken!
In einem Projekt stehe ich derzeit vor der Frage ob ich Instanzvariablen der Oberklasse privat mit Getter / Setter versehen soll oder eben protected an die Unterklasse vererben. Fakt ist, die Variablen werden in der Unterklasse benötigt. Gibt es diesbezüglich gängige Vorgehensweisen und was würdet ihr als guten Stil bezeichnen ?

Vielen Dank im Voraus
geneticZ

IMMER Getter und Setter. Dann liegt die Verantwortung was wie gemacht wird eindeutig in der Oberklasse der ja auch die Variable gehört!

Diese muss ja ggfls. prüfen ob ein Wert gesetzt werden darf oder nicht. Wenn eine Unterklasse das selber kann ist nicht gewährleistet ob solche Prüfungen z.B. passieren.

imho sollten alle member private sein! Abgesehen von statischen Konstanten.
 
Aber sind dann protected Instanzvariablen nicht komplett obsolet?
Wann würde man denn diese Verwenden? Und sollte man dann die Getter-Methode möglichst wenig aufrufen und die Variable dann lokal in der Unterinstanz speichern oder jedesmal bei Verwendung die die Instanzvariable per Methoden-Aufruf beziehen?
 
Zuletzt bearbeitet:
Aber sind dann protected Instanzvariablen nicht komplett obsolet?

Protected ist zum Beispiel bei Methoden sinnvoll.

Wenn Du eine gekapselte private Variable hast, greifst Du beispielsweise mit protected Methoden darauf zu. Sonst würde das Prinzip der Datenkapselung auf dem Umweg getter- und setter-Methoden ausgehebelt.
 
Aber sind dann protected Instanzvariablen nicht komplett obsolet?
Wann würde man denn diese Verwenden? Und sollte man dann die Getter-Methode möglichst wenig aufrufen und die Variable dann lokal in der Unterinstanz speichern oder jedesmal bei Verwendung die die Instanzvariable per Methoden-Aufruf beziehen?

Ich verwende nie protected member. Imho sind die auch wirklich unnötigt (zumindest fällt mir gerade kein vernünftiges Beispiel ein).

Puffern auf keinen Fall, sonst hebelst du ja eben wieder alles aus! Keine Prüfungen mehr ect...
 
Also die Getter und Setter Methoden sollten protected sein und die Variablen sollten nicht zwischengespeichert werden? Also ich spreche hier gerade natürlich von Ober- und Unterklassen und deren Vererbung. So langsam ordnet sich das alles in meinem Verständnis...
 
Zuletzt bearbeitet:
Also die Getter und Setter Methoden sollten protected sein und die Variablen sollten nicht zwischengespeichert werden? So langsam ordnet sich das alles in meinem Verständnis...

- Variablen nicht zwischenspeichern! Das macht mal grade gar keinen Sinn.
- Getter und Setter protected wenn diese ausschließlich in der Vererbungshierarchie genutzt werden sollen!
- Getter und Setter public, falls auch extern Zugriff erfolgen soll.

Die Kapeslung besteht ja darin gewisse Prüfungen durchführen zu können (Z.b. muss Wert B verändert werden wenn A einen bestimmten Wert hat...)
 

Neue Themen


Zurück
Oben