Vererbung Überschreibungs/Vererbungs-Problem

FlorianM

Mitglied
Guten Morgen liebe Leute,

ich bin derzeit dabei mir Java mit Hilfe von "Jetzt lerner ich Java 6" von "Markt und Techik" beizubringen.
Nun möchte ich das gelernte etwas festigen indem ich kleinere Programme schreibe. Nur leider mit der Vererbung bzw. der Überschreibung von Methoden klappt es nicht so ganz:

Java:
//Basisklasse
class Vererbung{
  int m_eins;
  int m_zwei;
  int m_drei;
  int m_summe;
  
  Vererbung(int eins, int zwei, int drei){
    m_eins = eins;
    m_zwei = zwei;
    m_drei = drei;
    m_summe = zusammenZaehlen();  
  }  
  int zusammenZaehlen(){
    int m_summe = m_eins + m_zwei + m_drei;
    return m_summe;
  }
  
  void ausgeben(){
    System.out.println("\nm_eins\t = " + m_eins);
    System.out.println("m_zwei\t = " + m_zwei);
    System.out.println("m_drei\t = " + m_drei);
    System.out.println("m_summe\t = " + m_summe);
  }
}
//abgeleitete Klasse
class WeiterVererbung extends Vererbung{
  WeiterVererbung(int eins, int zwei, int drei){
    
    super(eins, zwei, drei);
    m_summe = zusammenZaehlen();
  }  
  //Überschreibende Methode
  int zusammenZaehlen(){
    int m_Summe = m_eins + m_zwei + m_drei * 2;
    return m_summe;
  }
}

public class VererbungPub{    
  public static void main(String[] args){
   //Aufruf Basisklasse
    Vererbung ErsterGrad = new Vererbung(1,2,3);
    ErsterGrad.zusammenZaehlen();
    ErsterGrad.ausgeben();
    
    //Aufruf abgeleitete Klasse
    WeiterVererbung ZweiterGrad = new WeiterVererbung(4,5,6);
    ZweiterGrad.zusammenZaehlen();
    ZweiterGrad.ausgeben();    
  }
}

Mein Problem ist nun, dass ich die überschreibende Methode zusammenZaehlen(), aus der abgeleiteten Klasse nicht nutzen kann. Sprich: Die Feldvariable m_summe ändert sich in der Instanz ZweiterGrad nicht.
Könnt ihr mir da weiterhelfen?
 
Zuletzt bearbeitet:
Java:
int zusammenZaehlen(){
    int m_Summe = m_eins + m_zwei + m_drei * 2;
    return m_summe;
  }

Java ist case-sensitive... du gibst hier die Klassenvariable zurück...

im Zweifelsfall mach Sysouts, um festzustellen, in welcher methode du gerade bist...

lg
 
generell nie Variablen ähnlich benennen, falls nicht mit entscheidener Markierung
(summe vs tempSumme oder tSumme geht noch wenn unbedingt nötig)
und keine lokalen Variablen wie Klassenattribute benennen (bzw. derart verwechselbar ähnlich)

wenn m_ für Klassenattribute reserviert ist, dann nicht für lokale Variablen auch verwenden!


was soll zusammenZaehlen() eigentlich machen, das Klassenattribut ändern oder nicht?
wenn nur ein Rückgabewert ausgerechnet wird, dann machen Aufrufe wie
ZweiterGrad.zusammenZaehlen();
in der main-Methode keinen Sinn, die nutzen den Rückgabewert nicht, Variablen übrigens klein schreiben!

außerdem solltest du die Anzahl der Aufrufe des Zusammenzählens irgendwann auch mal begrenzen,
der Konstruktor der Oberklasse macht das (benutzt dann übrigens auch die Methode der Unterklasse),
das heißt dass der Konstruktor der Unterklasse das nicht unbedingt auch machen muss,
und schon gar nicht musst du dann in der main-Methode nochmal diese Methode verwenden, ob falsch oder richtig,

zuviel ist manchmal besser als zu wenig, aber in diesem kleinen abgeschlossenen Beispiel muss doch nicht schon Wiederholung sein
 
Weil es mir gerade auffällt. Gehört nicht zu gutem Programmierstil dazu, dass man immer den modifier dazuschreibt? (public, private, protected?)
 
kein Modifier ist ja strenggenommen auch einer, hat genau eine bestimmte Wirkung, wenn auch hier vielleicht nicht explizit eingesetzt,
soll man den für einen guten Stil nie verwenden dürfen?
 
Oh, das hab ich nicht gewusst, wofuer steht das dann?

EDIT: Seit 2 Tagen in dem Forum angemeldet und schon so viel gelernt 🙂
 

Zurück
Oben