2.03 Besondere Methoden – toString() und equals()

Ausgabe eines Objektes – toString()-Methode


Wiedergabe stellt eine Verbindung zu YouTube her.

Vielleicht ist Dir auch schon folgendes passiert. Du hast ein Objekt einer Klasse erstellt – also zum Beispiel ein Auto – und wolltest Dir zur Kontrolle seine Eigenschaften ausgeben lassen:

public class Autotest {

  public static void main(String[] args) {
    
    Auto meinErstesAuto = new Auto(1985, "DeLorean", 54000, false, 60000);
    
    System.out.println(meinErstesAuto);

  }

}

Dieser Versuch liefert allerdings nur eine sehr kryptische Ausgabe in dieser Art:

Auto@1c7c054

Grob gesprochen wird hier angezeigt, dass eine Instanz der Klasse Auto vorliegt und wo sie sich im Speicher befindet. Java weiß momentan noch nichts schöneres auszugeben als das.

Wenn wir eine andere Ausgabe erhalten wollen, müssen wir diese zunächst selbst festlegen. Dazu fügen wir der Klasse Auto die Methode toString() hinzu:

public class Auto {

  // Attribute
  private int baujahr;
  private String marke;
  private int kilometerstand;
  private boolean automatik;	
  private int preis;

  // Konstruktor
  public Auto(int pBaujahr, String pMarke, int pKilometerstand, boolean pAutomatik, int pPreis){
    baujahr = pBaujahr;
    marke = pMarke;
    kilometerstand = pKilometerstand;
    automatik = pAutomatik;
    preis = pPreis;
  }

  // weiterer Kontruktor für Neuwagen
  public Auto(String pMarke, boolean pAutomatik, int pPreis){
    baujahr = 2016;
    kilometerstand = 0;

    marke = pMarke;
    automatik = pAutomatik;
    preis = pPreis;
  }

  // Methoden
  public void macheProbefahrt(int pKilometer){
    if(pKilometer >= 0){
      kilometerstand = kilometerstand + pKilometer;
    }else{
      System.out.println("Betrugsversuch!");
    }
  }

  public void aenderePreisUm(int pAenderung){
    if (preis+pAenderung>0){
      preis = preis+pAenderung;
    }else{
      System.out.println("Die Änderung ist nicht zulässig!");
    }
  }

  // Getter
  public int getBaujahr() {
    return baujahr;
  }

  public String getMarke() {
    return marke;
  }

  public int getKilometerstand() {
    return kilometerstand;
  }

  public boolean isAutomatik() {
    return automatik;
  }

  public int getPreis() {
    return preis;
  }

  // NEUE METHODE:
  public String toString(){
    return baujahr+"er "+marke;
  }


}

Diese Methode gibt an, wie ein Objekt der Klasse Auto in einen String umgewandelt werden soll. Tatsächlich führt nun ein erneutes Ausführen des Tests von oben zu dieser Ausgabe:

1985er DeLorean

Selbstverständlich kannst Du die Methode nach Deinen Bedürfnissen anpassen und zum Beispiel mehr Details anzeigen lassen.

Vergleichen von Objekten – equals()-Methode


Wiedergabe stellt eine Verbindung zu YouTube her.

Schon beim Vergleichen von Strings und Arrays haben wir gesehen, dass ein doppeltes Gleichheitszeichen nicht den Inhalt vergleicht. Das ist ein ganz allgemeines Phänomen in Java. Dieser kleine Test

public class Autotest {

  public static void main(String[] args) {
    
    Auto meinErstesAuto = new Auto(1985, "DeLorean", 54000, false, 60000);
    Auto meinZweitesAuto = new Auto(1985, "DeLorean", 54000, false, 60000);
    
    System.out.println(meinErstesAuto == meinZweitesAuto);

  }

}

führt zur Ausgabe false, obwohl beide Autos absolut identische Eigenschaften haben.

Um zu prüfen, ob zwei Autos sich gleichen, können wir der Klasse Auto die Methode equals() hinzufügen. Mit dieser legen wir fest, wann wir zwei Autos als gleich ansehen wollen:

public class Auto {

  // Attribute
  private int baujahr;
  private String marke;
  private int kilometerstand;
  private boolean automatik;	
  private int preis;

  // Konstruktor
  public Auto(int pBaujahr, String pMarke, int pKilometerstand, boolean pAutomatik, int pPreis){
    baujahr = pBaujahr;
    marke = pMarke;
    kilometerstand = pKilometerstand;
    automatik = pAutomatik;
    preis = pPreis;
  }

  // weiterer Kontruktor für Neuwagen
  public Auto(String pMarke, boolean pAutomatik, int pPreis){
    baujahr = 2016;
    kilometerstand = 0;

    marke = pMarke;
    automatik = pAutomatik;
    preis = pPreis;
  }

  // Methoden
  public void macheProbefahrt(int pKilometer){
    if(pKilometer >= 0){
      kilometerstand = kilometerstand + pKilometer;
    }else{
      System.out.println("Betrugsversuch!");
    }
  }

  public void aenderePreisUm(int pAenderung){
    if (preis+pAenderung>0){
      preis = preis+pAenderung;
    }else{
      System.out.println("Die Änderung ist nicht zulässig!");
    }
  }

  public void schreibeInfos(){
    System.out.println("Dies ist ein "+baujahr+"er "+marke+".");
    System.out.println("Er ist nur "+kilometerstand+" Kilometer gefahren.");
    if(automatik){
      System.out.println("Dieses Modell verfügt über Automatik.");
    }
    System.out.println("Für nur "+preis+" € ist er zu haben!");
  }

  // Getter
  public int getBaujahr() {
    return baujahr;
  }

  public String getMarke() {
    return marke;
  }

  public int getKilometerstand() {
    return kilometerstand;
  }

  public boolean isAutomatik() {
    return automatik;
  }

  public int getPreis() {
    return preis;
  }
  
  // Ausgabe
  public String toString(){
    return baujahr+"er "+marke;
  }

  // Vergleich
  public boolean equals(Auto pVergleich){
    if (baujahr==pVergleich.baujahr && marke==pVergleich.marke){
      return true;
    }else{
      return false;
    }
  }

}

In dieser Version werden zwei Autos als gleich betrachtet, wenn sie dasselbe Baujahr haben und vom selben Modell sind. Damit führt zum Beispiel dieser Test

public class Autotest {

  public static void main(String[] args) {
    
    Auto meinErstesAuto = new Auto(1985, "DeLorean", 54000, false, 60000);
    Auto meinZweitesAuto = new Auto(1985, "DeLorean", 66000, false, 55000);
    
    System.out.println(meinErstesAuto.equals(meinZweitesAuto));

  }

}

die Ausgabe true. Natürlich könntest Du die equals()-Methode auch so gestalten, dass alle Attributwerte übereinstimmen müssen. Das ist Dir vollkommen freigestellt.

In der Lektion zur Bruchrechnung wird dieses Thema übrigens noch einmal vertieft.