Vererbung in java

Guten Tag


ich habe ein Klasse Mitarbeiter definiert



Java:
public class Mitarbeiter {

// anrede
public String anrede;

// vorname
public String vorname;

// nachname
public String nachname;

// gehalt
protected double gehalt;

public Mitarbeiter(String myAnrede, String myVorname
, String myNachname
, double myGehalt
) {
this.anrede = myAnrede;
this.vorname = myVorname;
this.nachname = myNachname;
this.gehalt = myGehalt;
}

}


und daraus eine weitere Klasse abgeleitet



Java:
public class Chef extends Mitarbeiter {
double bonus;
public Chef(String myAnrede, String myVorname
, String myNachname
, double myGehalt, double myBonus
) {
super(myAnrede, myVorname, myNachname, myGehalt);
this.bonus=myBonus;
}
}


der folgende Quelcode



Java:
import java.util.*;

public class MitarbeiterTest02 {

static Mitarbeiter[] arrayMitarbeiter= new Mitarbeiter[]{


new Mitarbeiter("Frau", "Andrea", "Vollmer", 4091.56),

new Chef("Frau", "Stamenka", "Wittig", 2347.98, 450.11),

new Chef("Herr", "Aputsiaq", "Neubauer", 3007.33, 450.44),

new Mitarbeiter("Herr", "Eigil", "Plat", 4898.54),
};

public static void main(String[] args) {



for (int i = 0; i < arrayMitarbeiter.length; i++) {
if(arrayMitarbeiter[i] instanceof Chef ){
System.out.printf(Locale.ENGLISH, "%1.3f\n", arrayMitarbeiter[i].getBonus());
}
if(arrayMitarbeiter[i] instanceof Mitarbeiter ){
System.out.printf(Locale.ENGLISH, "%s\n", arrayMitarbeiter[i].nachname);
}
}

}
}


gibt mir die Fehlermeldung


error: cannot find symbol

System.out.printf(Locale.ENGLISH, "%1.3f\n", arrayMitarbeiter.getBonus());

^

symbol: method getBonus()

location: class Mitarbeiter

1 error



Was mache ich Hier falsch? Gibt es eine Abhilfe, um die Bonus des Chefs anzuzeigen?



vielen Dank
 
Zuletzt bearbeitet von einem Moderator:
Du willst die Methode doch auf den Chef aufrufen und nicht auf das Array der Mitarbeiter. Insofern sollte Dein Skript so aussehen:
Java:
for ( int i = 0; i < arrayMitarbeiter.length; ++i ) {
  if ( arrayMitarbeiter[i] instanceof Chef ) {
    System.out.printf( Locale.ENGLISH, "%1.3f\n", arrayMitarbeiter[i].getBonus() );
  }

  // diese Überprüfung ist übrigens überflüssig,
  // da Du durch das Typecasting bereits definierst,
  // was in dem Array drin ist: Objekte aus der Klasse "Mitarbeiter"
  if ( arrayMitarbeiter[i] instanceof Mitarbeiter ) {
    System.out.printf( Locale.ENGLISH, "%s\n", arrayMitarbeiter[i].nachname );
  }
}
 
was haben Sie geändert. das ist doh die gleiche wie ein Quellcode:




Code:
import java.util.*;

public class MitarbeiterTest02 {

static Mitarbeiter[] arrayMitarbeiter= new Mitarbeiter[]{


new Mitarbeiter("Frau", "Andrea", "Vollmer", 4091.56),

new Chef("Frau", "Stamenka", "Wittig", 2347.98, 450.11),

new Chef("Herr", "Aputsiaq", "Neubauer", 3007.33, 450.44),

new Mitarbeiter("Herr", "Eigil", "Plat", 4898.54),
};

public static void main(String[] args) {



for (int i = 0; i < arrayMitarbeiter.length; i++) {
if(arrayMitarbeiter instanceof Chef ){
System.out.printf(Locale.ENGLISH, "%1.3f\n", arrayMitarbeiter.getBonus());
}
if(arrayMitarbeiter instanceof Mitarbeiter ){
System.out.printf(Locale.ENGLISH, "%s\n", arrayMitarbeiter.nachname);
}
}

}
}
 
Nope, ist es nicht: der Unterschied ist, dass ich die Index-Position angebe und somit auf ein Element des Arrays zugreife und nicht auf das gesamte Array an sich.
 
@Stefanie: Wenn die Formatierung im ersten Post nur halbwegs sinnvoll wäre...
So wurde das [i] als Anfang für kursiven Text verstanden und nicht angezeigt.
(Codeboxen gerade ausgebessert)

Und was euch beiden fehlt ist ein Cast.
Java:
if(arrayMitarbeiter instanceof Chef ){
    System.out.printf(Locale.ENGLISH, "%1.3f\n", ((Chef)arrayMitarbeiter).getBonus());
}
 
Hallo Stefanie,
ich vermute du hast vergessen den Getter für die Eigenschaft bonus zu Implementieren? Zumindest hast du keinen Getter in dem Codeausschnitt deiner Chef-Klasse.
Die Chef-Klasse sollte eher so aussehen:
Java:
public class Chef extends Mitarbeiter {

    private double bonus; // private?

    public Chef(String p_Anrede, String p_Vorname, String p_Nachname, double p_Gehalt, double p_Bonus) {

        super(p_Anrede, p_Vorname, p_Nachname, p_Gehalt);
        this.bonus = p_bonus;
    }

    public double getBonus() { // getter für Chef::bonus

        return this.bonus;
    }
}
Ich bin einfach mal davon ausgegangen - da du ja einen Getter benutzen möchtest - dass die Eigenschaft bonus eigentlich privat sein soll.

Die Frage ist allerdings immer, ob man wirklich Setter und Getter braucht. Natürlich ist es so, dass öffentliche Eigenschaften das Abschottungs-/Kapselungskonzept von Klassen etwas aufweichen, allerdings frage ich mich ob es wirklich besser ist einfach für jede Eigenschaft eine get- und set-Methode zu definieren...

Ich schätze das hängt wohl vom persönlichen Stil ab, deshalb will ich dir da nicht reinreden. Ich sage nur: Falls du bonus öffentlich (public) machst, kannst du dir getBonus() sparen.

Grüße Technipion
 
Zurück