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 Book-Klasse wurde eine neue Methode hinzugefügt:

class Book extends Waren implements Taxable
{
  protected String author;

  public Book(String des, double pr, String author)
  {
    super(des, pr);
    this.author  = author;
  }

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

  // die implementierte Schnittstelle
  public double calculateTax()
  {
    return pr * TAXRATE ;
  }

  // neu hinzugefügte Methode
  public String getAuthor()
  {
    return author;
  }
}

public class StoreTester2
{
  public static void main(String[] args)
  {
    Taxable artikel1 =
      new Book("Emma", 24.95, "Austen");
    System.out.println("Steuer fuer Artikel 1 "+
      artikel1.calculateTax() );

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

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

// diese Anweisung wird nicht kompilieren
System.out.println(
  artikel1.getAuthor());

In einem größeren Programm könnte es Taxable-Objekte geben, die keine getAuthor() Methode haben. Der Compiler kann nur die Methoden verwenden, die mit dem Typ der Referenzvariablen verbunden sind. In dem oben stehenden Programm sind nur die calculateTax() und die von Object geerbten Methoden 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: " +
  ( (Book)artikel1 ).getAuthor());

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

Dieses Programm ist nicht allzu sinnvoll, da alles ohne die Notwendigkeit einer Typumwandlung funktionieren würde, wenn die Variable artikel1 vom Typ Book 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 ( (Book)artikel1 ) benötigt:

( (Book)artikel1 ).getAuthor();
zur vorherigen Seite   zum Inhaltsverzeichnis   zur nächsten Seite