|
Die Klasse Object ist die Superklasse aller anderen Klassen. Jede Klasse, die keine extends-Klausel besitzt, wird direkt aus Object abgeleitet. Jede abgeleitete Klasse stammt schließlich von einer nicht mehr weiter abgeleiteten Klasse ab und ist damit letztlich selbst aus Object abgeleitet.
Die Klasse Object definiert einige elementare Methoden, die für alle Arten von Objekten nützlich sind:
boolean equals(Object obj) protected Object clone() String toString() int hashCode() |
java.lang.Object |
Die Methode equals testet, ob zwei Objekte denselben Inhalt haben, clone kopiert ein Objekt, toString erzeugt eine String-Repräsentation des Objekts, und hashCode berechnet einen numerischen Wert, der als Schlüssel zur Speicherung eines Objekts in einer Hashtable verwendet werden kann. Damit diese Methoden in abgeleiteten Klassen vernünftig funktionieren, müssen sie bei Bedarf überlagert werden. Für equals und clone gilt das insbesondere, wenn das Objekt Referenzen enthält.
Mit der Methode getClass der Klasse Object besitzt ein beliebiges Objekt die Fähigkeit, ein passendes Klassenobjekt zu liefern. Zu jeder Klasse, die das Laufzeitsystem verwendet, wird während des Ladevorgangs ein Klassenobjekt vom Typ Class erzeugt. Die Klasse Class stellt Methoden zur Abfrage von Eigenschaften der Klasse zur Verfügung und erlaubt es, Klassen dynamisch zu laden und Instanzen dynamisch zu erzeugen. Darüber hinaus ist sie der Schlüssel zur Funktionalität des Reflection-APIs.
Die Hauptklasse liest zunächst einen Klassennamen von der Standardeingabe ein. Mit der Klassenmethode forName der Klasse Class wird dann ein Klassenobjekt zu einer Klasse dieses Namens beschafft. Das wird verwendet, um mit der Methode newInstance der Klasse Class ein neues Objekt zu erzeugen. Dieses Objekt wird schließlich in das Interface HelloMeth konvertiert und dessen Methode hello aufgerufen.
Das Programm ist in der Lage, die beiden Klassen CA und CB ordnungsgemäß zu instanzieren und ihre Methode hello aufzurufen. Bei CC und CD gibt es eine Ausnahme des Typs ClassCastException, weil diese Klassen nicht das Interface HelloMeth implementieren. Alle anderen Klassennamen werden mit der Ausnahme ClassNotFoundException quittiert.
001 /* Listing3101.java */ 002 003 import java.io.*; 004 005 interface HelloMeth 006 { 007 public void hello(); 008 } 009 010 class CA 011 implements HelloMeth 012 { 013 public void hello() 014 { 015 System.out.println("hello CA"); 016 } 017 } 018 019 class CB 020 implements HelloMeth 021 { 022 public void hello() 023 { 024 System.out.println("hello CB"); 025 } 026 } 027 028 class CC 029 { 030 public void hello() 031 { 032 System.out.println("hello CC"); 033 } 034 } 035 036 class CD 037 { 038 public void hallo() 039 { 040 System.out.println("hallo CD"); 041 } 042 } 043 044 public class Listing3101 045 { 046 public static void main(String[] args) 047 { 048 String buf = ""; 049 BufferedReader in = new BufferedReader( 050 new InputStreamReader( 051 new DataInputStream(System.in))); 052 while (true) { 053 try { 054 System.out.print("Klassenname oder ende eingeben: "); 055 buf = in.readLine(); 056 if (buf.equals("ende")) { 057 break; 058 } 059 Class c = Class.forName(buf); 060 Object o = c.newInstance(); 061 ((HelloMeth)o).hello(); 062 } catch (IOException e) { 063 System.out.println(e.toString()); 064 } catch (ClassNotFoundException e) { 065 System.out.println("Klasse nicht gefunden"); 066 } catch (ClassCastException e) { 067 System.out.println(e.toString()); 068 } catch (InstantiationException e) { 069 System.out.println(e.toString()); 070 } catch (IllegalAccessException e) { 071 System.out.println(e.toString()); 072 } 073 } 074 } 075 } |
Listing3101.java |
Eine Beispielsitzung des Programms könnte so aussehen:
CA
hello CA
CB
hello CB
CC
java.lang.ClassCastException
CD
java.lang.ClassCastException
CE
Klasse nicht gefunden
ende
An diesem Beispiel ist zu sehen, wie Klassen geladen und instanziert werden können, deren Name zur Compilezeit nicht bekannt ist. In allen anderen Beispielen in diesem Buch wurden Klassennamen als literale Konstanten im Sourcecode gehalten und der Compiler konnte den passenden Code erzeugen. Wir wollen die nötigen Schritte noch einmal zusammenfassen:
|
Go To Java 2, Addison Wesley, Version 1.0.2, © 1999 Guido Krüger, http://www.gkrueger.com |