Setter und Getter/Vererbung

luj1990

Neues Mitglied
Hallo zusammen,
ich bräuchte schnell eure Hilfe, ich schreibe morgen eine Prüfung über Java und habe soeben von einem kommilitonen die Klausur vom letzen Jahr geschickt bekommen und verstehe die letze Aufgabe nicht so ganz.
Also die Aufgabe 8. Ich habe die Original Lösungen vom Professor gleich mit hochgeladen.
Ich habe die Sachen die ich nicht verstehe rot markiert.

Vielen Dank vom Voraus.
 

Anhänge

Der Konstruktor von Student ruft zuerst den Konstruktor der Basisklasse (Mensch) auf. Dort werden die Instanzvariablen, die in der Klasse Mensch definiert sind, initialisiert.
In diesem Fall ist die Zeile:
Java:
super();
aber optional. Auch ohne diese Zeile, würde der Default-Konstruktor der Basisklasse aufgerufen werden.
Unbedingt nötig wäre das, wenn du mehrere Konstruktoren in der Basisklasse hast und einen bestimmten davon aufrufen willst.

In der "ausgabe()" Methode wird zuerst die "ausgabe()" Methode der Basisklasse aufgerufen und dann werden die beiden Instanzvariablen der Studentklasse ausgegeben. Du musst ja alle Instanzvariablem von Student ausgebene - auch die geerbten !
 
Oh man, in was für nem Kurs bist du denn da gelandet? 😱

Auf das Wesentlich hat Dompteur dir ja schon geantwortet. Dem möchte ich aber noch hinzufügen:
In diesem Fall ist die Zeile:
Java:
super();
aber optional. Auch ohne diese Zeile, würde der Default-Konstruktor der Basisklasse aufgerufen werden.

Der Aufruf von super(); ist immer redundant. Nur wenn man einen anderen als den default-Konstruktor der Basisklasse aufrufen möchte, dann muss hier mit super gearbeitet werden. Aber super(); ohne Argumente kann man immer weglassen.

Zudem hast du den Aufruf der setter im Konstruktor angestrichen. Hier wird ein Student mit völlig aus der Luft gegriffenen Fantasie-Werten für die MatrikelNr und Jahr angelegt. Dazu gibt es (auch nach der Aufgabenstellung her) keinen Grund und es ist mMn einfach unschön. Wenn ich einen Standard-Konstruktor aufrufe, dann erwarte ich ein "sauberes" neues Objekt, welches allenfalls mit wirklich sinnvollen Standard-Werten befüllt ist. (Bspw das aktuelle Jahr, eine automatisch generierte Matrikelnummer o.Ä.)
Zudem ist der Aufruf der setter-Methoden im Konstruktor brandgefährlich. So einen Mist sollte man sich gar nicht erst angewöhnen. Wenn Methoden-Aufrufe im Konstruktor, dann möglichst nur Methoden die private oder final sind.

Insgesamt würde meine vollständige Lösung zu dieser Teilaufgabe so aussehen:
Java:
public Student() {};
 
Das betrifft nicht nur setter, sondern generell Methodenaufrufe im Konstruktor. Das Problem ist, dass die setter hier public sind, und damit von allen ableitenden Klassen problemlos überschrieben werden können. Damit hat man in der erbenden Klasse Zugriff auf this, bevor das Objekt vollständig initialisiert ist.

NetBeans z.B. schmeißt auch eine Warnung, wenn man etwas derartiges versucht.
 
Um auch mal ein Code-Beispiel zu liefern:

Java:
public class Child extends Parent {
  private Integer n;  
  public Child() {  
    setN(1);
    setI(1);
  }
  
  public void setN(int n) {  
    this.n=n;
  }
  
  @Override
  public void setI(int i) {  
    // do some validation in the setter
    if(n==null) {
      throw new RuntimeException("Es muss erst N gesetzt werden!");
    }
  }
  
  public static void main(String ... args) {
    Child c = new Child();
  }
}

class Parent {
  int i;
  public Parent() {  
    setI(1);
  }
  
  public void setI(int i) {  
    this.i = i;
  }
}

Wenn man so was vorfindet hat man doch richtig Spaß bei der Fehlersuche 🙂
 

Zurück
Oben