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 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.
Warum werden die äußeren, gelb hinterlegten Klammern um ( (Book)artikel1 )
benötigt:
( (Book)artikel1 ).getAuthor();