Würde das Folgende funktionieren?
System.out.println( artikel1.toString() ); System.out.println( artikel2.toString() );
Ja. Da alle Objekte von Object
erben, haben alle Objekte eine toString()
Methode.
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.
Warum werden die äußeren, gelb hinterlegten Klammern um ( (Buecher)artikel1 )
benötigt:
( (Buecher)artikel1 ).getAutor();