Vererbung mit toString()

excuseme

Mitglied
Hallo!
Ich habe erst einmal eine Klasse Ausweis mit den zugehörigen Attributen erstellt und einer Methode toString(), die aus der Main Klasse die Namen etc. bekommt. Stimmt dieser toString so und ist diese Methode dafür da, das die Ausgabe in der Main Klasse nicht in so einem komischen Hashcode erfolgt? Und was genau macht die Methode print, mit this.toString(). Das @Override wurde mir gesagt ist notwendig, aber ich verstehe nicht genau den Sinn dahinter.
Java:
public class Ausweis {
    private String vorname;
    private String nachname;
    private String geschlecht;

    public Ausweis(String vorname, String nachname, String geschlecht) {
   
    this.vorname = vorname;
    this.nachname = nachname;
    this.geschlecht = geschlecht;
    }
  
   //getter und setter

    public static void main(String[] args) {
        Ausweis ausweis = new Ausweis("Harry", "Derp", "M");
        System.out.println(ausweis);
    }
    public void print() {
        System.out.println(this.toString());
    }
    @Override
    public String toString() {
    return "Vorname: " + vorname + "\nNachname: " + nachname + "\nGeschlecht: " +geschlecht;
    }   
}

Nun möchte ich die Attribute an eine andere Klasse vererben.

Java:
public class Studentenausweis extends Ausweis {
   
    int matrikelnummer;
   
public Studentenausweis(String vorname, String nachname, String geschlecht, int matrikelnummer) {
    
     super(vorname, nachname, geschlecht);
     this.matrikelnummer = matrikelnummer;
    
}
    
     public int getMatrikelnummer() {
         return matrikelnummer;
     }
     public void setMatrikelnummer(int matrikelnummer) {
         this.matrikelnummer = matrikelnummer;
     }
    
     public static void main(String[] args) {
         Studentenausweis s = new Studentenausweis("Harry", "Derp", "M", 501421);
         System.out.println(s);
     }
     public void print() {
        System.out.println(this.toString());
     }
     @Override
     public String toString(){
         return "Vorname:" + getVorname() + "\nNachname:" + getNachname() + "\nGeschlecht:" + getGeschlecht() + "\nMatrikelnummer: " + matrikelnummer;
     }
}
Meine Frage hierzu ist, ob ich in der Main Klasse den Vornamen, Nachnamen und das geschlecht aus der Superklasse einfügen kann, ohne es selber nochmal ausfüllen zu müssen? Also so, dass ich nur die Matrikelnummer ergänzen muss. Und muss ich in der toString() Methode mit Gettern arbeiten?

Liebe Grüße!
 

temi

Top Contributor
... toString so und ist diese Methode dafür da, das die Ausgabe in der Main Klasse nicht in so einem komischen Hashcode erfolgt?
Ja.
Und was genau macht die Methode print, mit this.toString()
Ich nehme an, du meinst System.out.println()? Die ruft intern die "toString()" Methode auf...
Edit: OK, nicht aufgepasst: Die Methode "print" ruft natürlich zuerst die o.g. Methode auf. In der "main" müsstet du also nur noch schreiben ausweis.print()

Das @Override wurde mir gesagt ist notwendig, aber ich verstehe nicht genau den Sinn dahinter.
Es ist nicht zwingend notwendig, aber es verhindert Fehler, darum sollte man es sich angewöhnen, wenn man bei einer abgeleiteten Klasse Methoden überschreiben möchte. Außerdem zeigt es demjenigen, der deinen Code liest (oder auch dir selbst, nach einigen Wochen) an, dass du hier etwas überschreiben möchtest.

Würdest du z.B. beim Überschreiben von "toString()" versehentlich "ToString()" schreiben, dann würdest du eine Fehlermeldung vom Compiler erhalten, dass du nicht überschreibst.
 

temi

Top Contributor
Meine Frage hierzu ist, ob ich in der Main Klasse den Vornamen, Nachnamen und das geschlecht aus der Superklasse einfügen kann, ohne es selber nochmal ausfüllen zu müssen?
Die Frage verstehe ich nicht ganz. In einem Programm sollte es nur eine Klasse geben, die eine main()-Methode hat, insofern solltest du in beiden Klassen auf diese Methode verzichten und diese in eine andere Klasse verlagern.
 

mihe7

Top Contributor
Das meiste hat @temi schon beantwortet. Trotzdem noch mein Senf dazu:

die aus der Main Klasse
Die Bezeichnung "Main Klasse" ist etwas irreführend. Du hast zwei Klassen, jeweils mit main-Methode und mit "Main Klasse" meinst Du wahrscheinlich die Klasse, deren main-Methode beim Aufruf Deiner Anwendung verwendet wird.

Stimmt dieser toString so und ist diese Methode dafür da, das die Ausgabe in der Main Klasse nicht in so einem komischen Hashcode erfolgt?
Ob die Methode so "stimmt", können wir nicht beurteilen. Du hast toString richtig überschrieben, aber ob das Ergebnis Deinen Anforderungen genügt, musst Du selber wissen :)

Die Methode toString ist in Klasse Object (von der alle Klassen direkt oder indirekt automatisch erben) definiert und dient dazu, eine Darstellung des Objekts in Textform zu erhalten. In Object wird der Klassenname gefolgt von @ und dem Hashcode als Hex-String zurückgeben. Wem das nicht gefällt, kann die Methode überschreiben.

Dass die Methode bei der Ausgabe über System.out automatisch aufgerufen wird, ist übrigens keine Besonderheit der Sprache. System.out ist ein PrintWriter-Objekt. Diese Klasse defineirt die Methoden print, println und printf (auch) für Object und ruft dort - über den Umweg über String.valueOf(Object) - ganz profan Object#toString() auf.

Meine Frage hierzu ist, ob ich in der Main Klasse den Vornamen, Nachnamen und das geschlecht aus der Superklasse einfügen kann, ohne es selber nochmal ausfüllen zu müssen?
Meine Vermutung: es geht hier um die Klasse Studentenausweis. Und die Frage ist, ob Du in toString() den gleichen Code wie in der Superklasse Ausweis nochmal schreiben musst.

Nein, musst Du nicht. Mit dem Schlüsselwort super kann auf Variablen, Konstruktoren und Methoden der Superklasse zugegriffen werden:
Java:
public String toString() {
    return super.toString() + "\nMatrikelnummer: " + matrikelnummer;
}

Und muss ich in der toString() Methode mit Gettern arbeiten?
Die toString-Methode ist nichts spezielles. Ob Du ganz allgemein in Methoden mit Gettern arbeiten musst, hängt ebenso allgemein davon ab, ob Du direkten Zugriff auf die entsprechenden Variablen hast.

In Deinem Beispiel war es möglich, die Matrikelnummer ohne Getter auszugeben - Zugriff ist ja da. In Klasse Ausweis sind die Felder dagegen private, d. h. nur in der Klasse Ausweis hast Du auf diese Felder Zugriff. Außerhalb der Klasse ist der Zugriff nur über entsprechende Methoden (Getter) möglich.

Wären die Felder nicht private sondern nur protected, dann könntest Du auf diese auch in Subklassen direkt zugreifen. Davon würde ich aber im Allgemeinen abraten, weil das leicht zu fragilem Code führen kann. Grundregel: Zugriff möglichst restriktiv handhaben - Instanzvariablen sind private.
 
X

Xyz1

Gast
Das @Override wurde mir gesagt ist notwendig, aber ich verstehe nicht genau den Sinn dahinter
Ne, ist nicht notwendig, das ist eine IDE Anmerkung.

Und muss ich in der toString() Methode mit Gettern arbeiten?
Manchmal wird das gemacht - oder auch this. aber Oracle selber macht das auch nicht.

Meine Frage hierzu ist, ob ich in der Main Klasse den Vornamen, Nachnamen und das geschlecht aus der Superklasse einfügen kann, ohne es selber nochmal ausfüllen zu müssen?

Java:
     @Override
     public String toString(){
         return "Vorname:" + vorname + " Nachname:" + nachname + " Geschlecht:" + geschlecht;
     }
//....

     @Override
     public String toString(){
         return super.toString() + " Matrikelnummer:" + matrikelnummer;
     }
 

excuseme

Mitglied
Vielen Dank an alle eure Antworten! Das mit return super.toString() funktioniert ja super und der Code sieht gleich viel kompakter aus.
Ich muss jetzt zusätzlich eine Methode schreiben, in der ich ein Feld erstelle mit 6 Instanzen. Das Feld soll 2 Instanzen von Ausweis und Studentenausweis erzeugen und 2 Objekte von Vereinsausweis beinhalten. Die Rückgabe soll das in dieser Methode erzeugte Feld sein. Ich komm da aber irgendwie gerade an keinen Ansatz, wahrscheinlich wieder zulange pausiert wegen Weihnachten.
Kann mir jemand vielleicht nen kleinen Denkanstoß geben?
 

mihe7

Top Contributor
Java:
Ausweis[] ausweise = new Ausweis[6]; // Platz für 6 Ausweise schaffen
ausweise[0] = new Ausweis(...); // 1. Ausweis
ausweise[1] = new Ausweis(...); // 2. Ausweis
ausweise[2] = new Studentenausweis(...); // 3. Ausweis = ein Studentenausweis
usw.

Nachtrag:
Das mit return super.toString() funktioniert ja super
Damit wäre auch geklärt, warum das Schlüsselwort super heißt :cool:
 
Zuletzt bearbeitet:
Ähnliche Java Themen
  Titel Forum Antworten Datum
W LocalDate toString und nach Split falsch "erkannt"? Java Basics - Anfänger-Themen 8
W ArrayList und toString Java Basics - Anfänger-Themen 17
W toString bei composition Java Basics - Anfänger-Themen 4
M Unterschied Integer.toString(x) und x.toString() Java Basics - Anfänger-Themen 22
E Einrücken inner der toString()-Methode Java Basics - Anfänger-Themen 34
W Objekte über Scanner Input; ToString Probleme... Java Basics - Anfänger-Themen 4
M Polymorphie toString Java Basics - Anfänger-Themen 13
Y Wie kann ich ein Element in einer toString finden. Java Basics - Anfänger-Themen 2
A Implementierung von String toString methode() Java Basics - Anfänger-Themen 4
P falscher booleanwert bei toString Java Basics - Anfänger-Themen 4
P Methode die eigentlich einen Scanner benötigt mit toString() Java Basics - Anfänger-Themen 5
M Wie analysiert JSON eine toString-Ausgabe ? Java Basics - Anfänger-Themen 1
J Methoden toString()-Date Formatter Java Basics - Anfänger-Themen 8
V Neue Ausgabe von toString nach Methodenaufruf Java Basics - Anfänger-Themen 9
M Die Inhalte eines Arrays mit der Methode Arrays.toString ausgeben Java Basics - Anfänger-Themen 4
H toString-Methode Java Basics - Anfänger-Themen 24
O Referenz - toString Java Basics - Anfänger-Themen 9
B toString mit optionaler Ausgabe überrschreiben Java Basics - Anfänger-Themen 5
J toString-Methode in Verbindung mit varArgs-Konstruktor Java Basics - Anfänger-Themen 18
C Methoden toString Java Basics - Anfänger-Themen 4
B toString() Dilemma Java Basics - Anfänger-Themen 7
TomatenBrot447 Mit toString eine Ausgabe liefern wie in einer schon implementierten Methode ? Java Basics - Anfänger-Themen 13
TomatenBrot447 Mit toString eine Ausgabe liefern wie in einer schon implementierten Methode ? Java Basics - Anfänger-Themen 1
V ToString-Methode mit JUnit testen(BlueJ) Java Basics - Anfänger-Themen 10
D Arrays.toString spuckt null aus? Java Basics - Anfänger-Themen 3
S Methoden equals(object o) / toString Java Basics - Anfänger-Themen 15
K array in toString des objektes ausgeben Java Basics - Anfänger-Themen 1
Psypsy hashCode, equals und toString Java Basics - Anfänger-Themen 3
J toString() Methode und ArrayList Java Basics - Anfänger-Themen 1
K toString() Java Basics - Anfänger-Themen 1
H Erste Schritte Arrayes.toString methode funktioniert nicht Java Basics - Anfänger-Themen 2
A Problem mit toString Methode Java Basics - Anfänger-Themen 8
T String toString methode nicht vererbt ... Java Basics - Anfänger-Themen 4
I Vererbung toString() Frage Java Basics - Anfänger-Themen 5
M Unbekannte Nummer bei Aufruf der toString Methode Java Basics - Anfänger-Themen 3
E Richtige Ausgabe nur mit toString() - Warum? Java Basics - Anfänger-Themen 4
S Datentypen List.toString wirft NullPointerException Java Basics - Anfänger-Themen 5
A ToString()-Methode richtig benutzen Java Basics - Anfänger-Themen 3
J ArrayList toString() Übergabe Fehler Java Basics - Anfänger-Themen 2
F Eigene LinkedList - toString Java Basics - Anfänger-Themen 10
A JList / toString modify Java Basics - Anfänger-Themen 2
J Vererbung Überschriebene toString-Methode aufrufen Java Basics - Anfänger-Themen 10
M toString gibt "null" statt "0.0" aus Java Basics - Anfänger-Themen 5
M toString Java Basics - Anfänger-Themen 7
H Integer.toString(int i) vs. String.valueOf(int i) Java Basics - Anfänger-Themen 12
C Methoden String von einem toString() herauslesen Java Basics - Anfänger-Themen 2
B Wann toString() überschreiben? Java Basics - Anfänger-Themen 21
P toString-Methode gibt immer null vor Variable aus Java Basics - Anfänger-Themen 9
N .toString() und (string) Java Basics - Anfänger-Themen 2
B Methoden toString Methode mit Schlüsselwort new Java Basics - Anfänger-Themen 3
S schwierigkeit mit in der verwaltungsklasse benutzen von toString() Java Basics - Anfänger-Themen 7
J Zweidimensionales Array durch ToString ausgeben lassen Java Basics - Anfänger-Themen 21
N Matrix an toString Java Basics - Anfänger-Themen 7
A Werteausgabe des Construktors mit toString Java Basics - Anfänger-Themen 2
D super.tostring Java Basics - Anfänger-Themen 8
A Stringarray toString Java Basics - Anfänger-Themen 5
L toString()-Methode in verschieden Klassen Java Basics - Anfänger-Themen 3
R Frage zu statischer Methode toString() Java Basics - Anfänger-Themen 3
S Escape Sequenz in der toString() ? Java Basics - Anfänger-Themen 4
S Stack als verkettete liste/ toString methode Java Basics - Anfänger-Themen 3
A Arrays.asList(s).toString() ohne [] und , Java Basics - Anfänger-Themen 3
P toString Java Basics - Anfänger-Themen 4
M .toString(); // Ausgabe: Attribut von Vaterklasse Java Basics - Anfänger-Themen 12
K toString Java Basics - Anfänger-Themen 10
F toString Methode ausgeben Java Basics - Anfänger-Themen 3
A Object -> String mit valueOf, toString oder cast ? Java Basics - Anfänger-Themen 6
R getClass und getName sowie toString Java Basics - Anfänger-Themen 10
D Arrays.toString problem Java Basics - Anfänger-Themen 2
D array.toString() wieso funktioniert es nicht Java Basics - Anfänger-Themen 4
S toString-Methode für Map Java Basics - Anfänger-Themen 15
L OOP hilfe bei tostring methode Java Basics - Anfänger-Themen 6
D toString überschreiben + Exception werfen Java Basics - Anfänger-Themen 3
H toString / println Java Basics - Anfänger-Themen 2
H toString() erben? Java Basics - Anfänger-Themen 3
A Arrays.toString() ohne [ und ] Java Basics - Anfänger-Themen 2
K Arrays.toString(); funktioniert nicht Java Basics - Anfänger-Themen 4
A byte.toString() -> Datenmüll Java Basics - Anfänger-Themen 52
K Problem mit .toString und FileReader Java Basics - Anfänger-Themen 2
G toString Problem Java Basics - Anfänger-Themen 12
G Gregorian Calendar aus toString() Ausgabe wiederherstellen Java Basics - Anfänger-Themen 4
T Warum Fehlermeldung bei diesem ToString Programm? Java Basics - Anfänger-Themen 2
B toString Java Basics - Anfänger-Themen 5
S Was macht [Integer.toString(number, tarRadix)] Java Basics - Anfänger-Themen 3
G Probleme bei toString Überschreibung Java Basics - Anfänger-Themen 6
M int toString Datentypen Umwandeln, AnfängerProblem Java Basics - Anfänger-Themen 3
T keine Ausgabe von toString obwohl keine Fehlermeldung Java Basics - Anfänger-Themen 5
D ToString Java Basics - Anfänger-Themen 3
C Bedeutung von toString im Bezug auf Text Java Basics - Anfänger-Themen 4
N char[] aus JPasswordField toString() Java Basics - Anfänger-Themen 6
T Boolean toString ? Java Basics - Anfänger-Themen 3
D Frage zum Aufruf einer toString-Methode Java Basics - Anfänger-Themen 2
H toString(); varargs; bitSet Java Basics - Anfänger-Themen 8
M getClass() und getClass().toString() Java Basics - Anfänger-Themen 4
V toString()-Methode Java Basics - Anfänger-Themen 9
S PrintWriter-Probleme mit toString Methode->Person@17182c1 Java Basics - Anfänger-Themen 10
P Vektor toString? Java Basics - Anfänger-Themen 2
S valueOf() vs. toString() Verwendung??? Java Basics - Anfänger-Themen 13
G Frage zur toString ? Java Basics - Anfänger-Themen 4
L .toString wieder rückgängig machen Java Basics - Anfänger-Themen 7
H Was ist toString ??? Java Basics - Anfänger-Themen 7

Ähnliche Java Themen

Neue Themen


Oben