zur vorherigen Seite   zum Inhaltsverzeichnis   zur nächsten Seite

Würde das Folgende funktionieren?

System.out.println( artikel1.toString() );
System.out.println( artikel2.toString() );

Antwort:

Ja. Da alle Objekte von Object erben, haben alle Objekte eine toString() Methode.

Typumwandlung

Der Buecher-Klasse wurde eine neue Methode hinzugefügt:

class Buecher extends Waren implements Besteuerbar
{
  protected String autor;

  public Buecher( String beschreibung, double preis, String autor)
  {
    super( beschreibung, preis );
    this.autor  = autor ;
  }

  public String toString()
  {
    return super.toString() + "Autor: " + autor ;
  }

  public double berechneSteuer() // die implementierte Schnittstelle
  {
    return preis * STEUERSATZ ;
  }

  // neu hinzugefügte Methode
  public String getAutor()
  {
    return autor;
  }
}

public class KaufhausTester3
{
  public static void main ( String[] args )
  {
    Besteuerbar artikel1 = new Buecher ( "Emma", 24.95, "Austen" );
    System.out.println( "Steuer fuer Artikel 1 "+ artikel1.berechneSteuer() );

    System.out.println( "Autor: " + artikel1.getAutor() );
  }
}

Wenn eine Variable vom Typ Besteuerbar ist, ist alles was der Compiler kennt der Aspekt Besteuerbar des Objekts. Die folgende Anweisung in dem oben stehenden Programm wird nicht kompilieren, da Besteuerbar-Objekte nicht notwendigerweise die geforderte Methode haben.

System.out.println( "Autor: " + artikel1.getAutor() );

In einem größeren Programm könnte es Besteuerbar-Objekte geben, die keine getAutor() Methode haben. Der Compiler kann nur die Methoden verwenden, die mit dem Typ der Referenzvariablen verbunden sind. In dem oben stehenden Programm ist nur die berechneSteuer() Methode mit der Referenzvariablen verbunden.

Aber wir können eine Typumwandlung verwenden, um dem Compiler mitzuteilen, dass eine Variable auf ein Objekt einer bestimmten Klasse verweist:

System.out.println( "Autor: " +
  ( (Buecher)artikel1 ).getAutor() );

Jetzt kann die getAutor() Methode des Objekts gefunden werden, auf das artikel1 verweist. Da dem Compiler mitgeteilt wurde, dass artikel1 auf ein Buecher-Objekt verweist.

Dieses Programm ist nicht allzu sinnvoll, da alles ohne die Notwendigkeit einer Typumwandlung funktionieren würde, wenn die Variable artikel1 vom Typ Buecher wäre. Aber in Programmen mit einer komplizierteren Logik sind solche Konvertierungen manchmal notwendig.


FRAGE 16:

Warum werden die äußeren, gelb hinterlegten Klammern um ( (Buecher)artikel1 ) benötigt:

( (Buecher)artikel1 ).getAutor();
zur vorherigen Seite   zum Inhaltsverzeichnis   zur nächsten Seite