Der Typ eines Objekts in Java
Konstanz des Objekttyp
Der Typ eines Objektes ist unveränderlich, er wird durch den Typ für den Namen des Objekts nicht beeinflußt.
Main.java
public final class Main
{public static void show( final java.lang.Object o )
{ java.lang.System.out.println( o.getClass() ); }public static void main( final java.lang.String[] args )
{ final java.lang.String s = "abc"; show( s );
final java.lang.CharSequence cs = s; show( cs );
final java.lang.Object o = s; show( o ); }}- Protokoll
class java.lang.String
class java.lang.String
class java.lang.StringMain.java
public final class Main
{public static void show( final java.lang.Object o )
{ java.lang.System.out.println( o.getClass() ); }public static void main( final java.lang.String[] args )
{ java.lang.Object o;o = "abc"; show( o );
o = java.lang.System.out; show( o ); }}- Protokoll
class java.lang.String
class java.io.PrintStreamMain.java
public final class Main
{ public static void main( final java.lang.String[] args )
{ final java.io.PrintStream out = java.lang.System.out;final java.lang.CharSequence s = "def"; out.println( s );
final java.lang.Object o = s; out.println( o );
out.println( o == s );
out.println( o.getClass() == s.getClass() ); }}- Protokoll
def
def
true
true
Das „doppelte“ Typsystem
Java hat ein „doppeltes“ Typsystem, in dem sowohl Ausdrücke als auch Objekte einen Typ haben.
Für die objektorientierte Programmierung wäre eigentlich ein einfaches Typsystem ausreichend, bei dem nur die Objekte einen Typ haben.
Die Typen von Ausdrücken erlauben es in Java, bestimmte Fehler in einem Programm schon beim Übersetzen zu erkennen. Dadurch kann es verhindert werden, daß einige dieser Fehler erst bei der Ausführung eines bestimmten Programmteils auftreten (zu einem Zeitpunkt, zu dem das Programm möglicherweise schon längere Zeit bei einem Kunden im Einsatz ist). Wegen dieser sogenannten „statischen Typsicherheit“ ist Java bei einigen Unternehmen beliebt. Andererseits führt das doppelte Typssystem zu längerem Quelltext und meldet manchmal Fehler, die ohne dieses doppelte Typsystem gar keine Fehler wären. Es macht die Sprache auch komplizierter und erschwert dadurch das Erlernen.
Der Compiler sieht nur die Typen von Ausdrücken, nicht die Typen von Objekten.
Wiederholung von Regeln in Zusammenhang mit Typen
ℛ String-Regel Ein Zeichenfolgenliteral hat den Typ »java.lang.String«. Sein Wert ist ein Objekt, das ebenfalls den Typ »java.lang.String« hat.
Übungsfragen
? Übungsfrage
Welchen Typ hat der Ausdruck »s« in den runden Klammern des folgenden Blocks?
Welchen Typ hat das Objekt »s« in den runden Klammern des folgenden Blocks? („Das Objekt »s«“ ist dasjenige Objekt, welches der Wert des Ausdrucks »s« ist.)
- Quelltext
{ final java.lang.Object s = "abc"; java.lang.System.out.println( s ); }
Übungsfragen
? Übungsfrage
Welche Ausgabe erzeugt das folgende Programm?
Main.java
public final class Main
{public static void method( final java.lang.Object o )
{ java.lang.System.out.println( o.getClass() ); }public static void method( final java.io.OutputStream os )
{ java.lang.System.out.println( os.getClass() ); }public static void method( final java.io.FilterOutputStream fos )
{ java.lang.System.out.println( fos.getClass() ); }public static void method( final java.io.PrintStream ps )
{ java.lang.System.out.println( ps.getClass() ); }public static void main( final java.lang.String[] args )
{ final java.io.PrintStream printStream = java.lang.System.out;
final java.io.FilterOutputStream filterOutputStream = java.lang.System.out;
final java.io.OutputStream outputStream = java.lang.System.out;
final java.lang.Object object = java.lang.System.out;
method( object );
method( filterOutputStream ); }}