Galileo Computing < openbook > Galileo Computing - Professionelle Bücher. Auch für Einsteiger.
Professionelle Bücher. Auch für Einsteiger.

Inhaltsverzeichnis
Vorwort
1 Java ist auch eine Sprache
2 Sprachbeschreibung
3 Klassen und Objekte
4 Der Umgang mit Zeichenketten
5 Mathematisches
6 Eigene Klassen schreiben
7 Angewandte Objektorientierung
8 Exceptions
9 Generics, innere Klassen
10 Die Klassenbibliothek
11 Threads und nebenläufige Programmierung
12 Datenstrukturen und Algorithmen
13 Raum und Zeit
14 Dateien und Datenströme
15 Die eXtensible Markup Language (XML)
16 Grafische Oberflächen mit Swing
17 Grafikprogrammierung
18 Netzwerkprogrammierung
19 Verteilte Programmierung mit RMI und Web–Services
20 JavaServer Pages und Servlets
21 Applets
22 Midlets und die Java ME
23 Datenbankmanagement mit JDBC
24 Reflection und Annotationen
25 Logging und Monitoring
26 Sicherheitskonzepte
27 Java Native Interface (JNI)
28 Dienstprogramme für die Java-Umgebung
Stichwort

Download:
- ZIP, ca. 14,1 MB
Buch bestellen
Ihre Meinung?

Spacer
<< zurück
Java ist auch eine Insel (8. Auflage) von Christian Ullenboom
Programmieren mit der Java Standard Edition Version 6
Buch: Java ist auch eine Insel (8. Auflage)

Java ist auch eine Insel (8. Aufl.)
8., aktual. Auflage, geb., mit DVD
1.475 S., 49,90 Euro
Galileo Computing
ISBN 978-3-8362-1371-4
Pfeil 3 Klassen und Objekte
Pfeil 3.1 Objektorientierte Programmierung
Pfeil 3.1.1 Warum überhaupt OOP?
Pfeil 3.1.2 Denk ich an Java, denk ich an Wiederverwendbarkeit
Pfeil 3.2 Eigenschaften einer Klasse
Pfeil 3.2.1 Die Klasse Point
Pfeil 3.3 Die UML (Unified Modeling Language)
Pfeil 3.3.1 Hintergrund und Geschichte zur UML
Pfeil 3.3.2 Wichtige Diagrammtypen der UML
Pfeil 3.3.3 UML-Werkzeuge
Pfeil 3.4 Neue Objekte erzeugen
Pfeil 3.4.1 Anlegen eines Exemplars einer Klasse mit dem new-Operator
Pfeil 3.4.2 Deklarieren von Referenzvariablen
Pfeil 3.4.3 Zugriff auf Variablen und Methoden mit dem ».«
Pfeil 3.4.4 Konstruktoren nutzen
Pfeil 3.5 Pakete und import-Deklarationen nutzen
Pfeil 3.5.1 Volle Qualifizierung und import-Deklaration
Pfeil 3.5.2 import *
Pfeil 3.6 Mit Referenzen arbeiten
Pfeil 3.6.1 Zuweisungen bei Referenzen
Pfeil 3.6.2 Methoden mit nicht-primitiven Parametern
Pfeil 3.7 Identität und Gleichheit
Pfeil 3.7.1 Identität von Objekten
Pfeil 3.7.2 Gleichheit und die Methode equals()
Pfeil 3.7.3 Die null-Referenz
Pfeil 3.8 Wrapper-Klassen und Autoboxing
Pfeil 3.8.1 Erzeugen von Wrapper-Objekten
Pfeil 3.8.2 Konvertierungen in eine String-Repräsentation
Pfeil 3.8.3 Die Klasse Integer
Pfeil 3.8.4 Die Klassen Double und Float für Fließkommazahlen
Pfeil 3.8.5 Die Basisklasse Number für numerische Wrapper-Objekte
Pfeil 3.8.6 Die Boolean-Klasse
Pfeil 3.8.7 Autoboxing: Boxing und Unboxing
Pfeil 3.9 Compilationseinheiten und eigene Pakete schnüren
Pfeil 3.9.1 Die package-Anweisung
Pfeil 3.9.2 Importieren von Klassen mit import
Pfeil 3.9.3 Hierarchische Strukturen und das Default-Package
Pfeil 3.9.4 Paketnamen
Pfeil 3.9.5 Klassen mit gleichen Namen in unterschiedlichen Paketen
Pfeil 3.9.6 Compilationseinheit (Compilation Unit)
Pfeil 3.9.7 Statischer Import
Pfeil 3.9.8 Eine Verzeichnisstruktur für eigene Projekte
Pfeil 3.10 Arrays
Pfeil 3.10.1 Deklaration von Arrays
Pfeil 3.10.2 Arrays mit Inhalt
Pfeil 3.10.3 Die Länge eines Arrays über das Attribut length
Pfeil 3.10.4 Zugriff auf die Elemente über den Index
Pfeil 3.10.5 Array-Objekte mit new erzeugen
Pfeil 3.10.6 Fehler bei Arrays
Pfeil 3.10.7 Die erweiterte for-Schleife
Pfeil 3.10.8 Arrays mit nicht-primitiven Elementen
Pfeil 3.10.9 Mehrdimensionale Arrays
Pfeil 3.10.10 Vorinitialisierte Arrays
Pfeil 3.10.11 Mehrere Rückgabewerte
Pfeil 3.10.12 Methode mit variabler Argumentanzahl (Vararg)
Pfeil 3.10.13 Klonen kann sich lohnen – Arrays vermehren
Pfeil 3.10.14 Feldinhalte kopieren
Pfeil 3.10.15 Die Klasse Arrays zum Vergleichen, Füllen und Suchen
Pfeil 3.11 Der Einstiegspunkt für das Laufzeitsystem: main()
Pfeil 3.11.1 Kommandozeilen-Argumente verarbeiten
Pfeil 3.11.2 Der Rückgabewert von main() und System.exit()
Pfeil 3.12 Zum Weiterlesen


Galileo Computing - Zum Seitenanfang

3.7 Identität und Gleichheit Zur nächsten ÜberschriftZur vorigen Überschrift


Galileo Computing - Zum Seitenanfang

3.7.1 Identität von Objekten Zur nächsten ÜberschriftZur vorigen Überschrift

Der Vergleichsoperator == ist für alle Datentypen so definiert, dass er die vollständige Übereinstimmung zweier Werte testet. Bei primitiven Datentypen ist das einfach einzusehen, und bei Referenztypen im Prinzip genauso. Der Operator == testet bei Referenzen, ob diese übereinstimmen, also auf das gleiche Objekt verweisen. Demnach sagt der Test etwas über die Identität der referenzierten Objekte aus, aber nicht, ob zwei verschiedene Objekte möglicherweise den gleichen Inhalt haben. Der Inhalt der Objekte spielt bei == nie eine Rolle.


Beispiel Zwei Objekte mit drei unterschiedlichen Punktvariablen p, q, r und die Bedeutung von ==:

Point p = new Point( 10, 10 ); 
Point q = p; 
Point r = new Point( 10, 10 ); 
if ( p == q )    // wahr, da p und q dasselbe Objekt referenzieren 
  ... 
if ( p == r )    // falsch, da p und r zwei verschiedene Punkt-Objekte 
  ...            // referenzieren, die zufällig dieselben Koordinaten haben

Da p und q auf dasselbe Objekt verweisen, ergibt der Vergleich true. p und r referenzieren unterschiedliche Objekte, die aber zufälligerweise den gleichen Inhalt haben. Doch woher soll der Compiler wissen, wann zwei Punkt-Objekte inhaltlich gleich sind? Weil sich ein Punkt durch die Attribute x und y auszeichnet? Die Laufzeitumgebung könnte voreilig die Belegung jeder Objektvariablen vergleichen, doch das entspricht nicht immer einem korrekten Vergleich, so wie wir ihn uns wünschen. Ein Punkt-Objekt könnte etwa zusätzlich die Anzahl der Zugriffe zählen, die jedoch für einen Vergleich, der auf der Lage zweier Punkte basiert, nicht berücksichtigt werden darf.


Galileo Computing - Zum Seitenanfang

3.7.2 Gleichheit und die Methode equals() Zur nächsten ÜberschriftZur vorigen Überschrift

Die allgemein gültige Lösung besteht darin, die Klasse festlegen zu lassen, wann Objekte gleich sind. Dazu kann jede Klasse eine Methode equals() implementieren, die Exemplare dieser Klasse mit beliebigen anderen Objekten vergleichen kann. Die Klassen entscheiden immer nach Anwendungsfall, welche Attribute sie für einen Gleichheitstest heranziehen, und equals() liefert true, wenn die gewünschten Zustände (Objektvariablen) übereinstimmen.


Beispiel Zwei inhaltlich gleiche Punkt-Objekte, verglichen mit == und equals().

Point p = new Point( 10, 10 ); 
Point q = new Point( 10, 10 ); 
 
if ( p == q )         // false 
  ... 
if ( p.equals(q) )    // true. Da symmetrisch auch q.equals(p) 
  ...

Nur equals() testet in diesem Fall die inhaltliche Gleichheit.


Bei den unterschiedlichen Bedeutungen müssen wir demnach die Begriffe »Identität« und »Gleichheit« von Objekten sorgfältig unterscheiden. Daher noch einmal eine Zusammenfassung:


Getestet mit Implementierung

Identität der Referenzen

==

nichts zu tun

Gleichheit der Zustände

equals()

abhängig von der Klasse


Es gibt immer ein equals()

Glücklicherweise müssen wir als Programmierer nicht lange darüber nachdenken, ob eine Klasse eine equals()-Methode anbieten soll oder nicht. Jede Klasse besitzt sie, da die universelle Oberklasse Object sie vererbt. Wir greifen hier auf Kapitel 6, »Eigene Klassen schreiben«, vor; der Abschnitt kann aber übersprungen werden.

Die Unterklasse Point überschreibt equals(), wie die API-Dokumentation zeigt. Werfen wir einen Blick auf die equals()-Methode aus Point, um eine Vorstellung von der Arbeitsweise zu bekommen:

public boolean equals( Object obj ) 
{ 
  if ( obj instanceof Point ) { 
    Point pt = (Point) obj; 
    return (x == pt.x) && (y == pt.y);   // (*) 
  } 
  return super.equals( obj ); 
}

Obwohl bei diesem Beispiel für uns einiges neu ist, erkennen wir den Vergleich in der Zeile (*). Hier vergleicht das Point-Objekt seine eigenen Attribute mit den Attributen des Objekts, das als Argument an equals() übergeben wurde.

Die Oberklasse Object und ihr equals()

Wenn eine Klasse keine equals()-Methode angibt, dann erbt sie eine Implementierung aus der Klasse Object, die wie folgt aussieht:

public boolean equals( Object obj ) 
{ 
  return ( this == obj ); 
}

Wir erkennen, dass hier die Gleichheit auf die Gleichheit der Referenzen abgebildet wird. Ein inhaltlicher Vergleich findet nicht statt.


Hinweis Der Datentyp für den Parameter in der equals()-Methode ist immer Object und niemals etwas anderes, da sonst equals() nicht überschrieben, sondern überladen wird. Folgendes für eine Klasse K ist also falsch:

public class K 
{ 
  private int v; 
  public boolean equals( K that ) { return this.v == that.v; } 
}

Im Vokabular der Informatiker gesprochen: Java unterstützt bisher keine kovarianten Typ-Parameter, wohl aber seit Java 5 kovariante Rückgabetypen.



Galileo Computing - Zum Seitenanfang

3.7.3 Die null-Referenz topZur vorigen Überschrift

In Java gibt es drei spezielle Referenzen: null, this und super. (Wir verschieben this und super auf Kapitel 6.) Das spezielle Literal null lässt sich zur Initialisierung von Referenzvariablen verwenden. Die null-Referenz ist typenlos, kann also jeder Referenzvariable zugewiesen und jeder Methode übergeben werden, die ein Objekt erwartet. Daher ist Folgendes gültig:

Point  p = null; 
String s = null; 
System.out.println( null );

Da es nur ein null gibt, ist zum Beispiel (Point) null == (String) null. Der Wert ist ausschließlich für Referenzen vorgesehen und kann in keinen primitiven Typ wie die Ganzzahl 0 umgewandelt werden. [Hier unterscheiden sich C(++) und Java.]

Mit null lässt sich eine ganze Menge machen. Der Haupteinsatz sieht vor, damit uninitialisierte Referenzvariablen zu kennzeichnen, also auszudrücken, dass eine Referenzvariable auf kein Objekt verweist. In Listen oder Bäumen kennzeichnet null aber auch das Fehlen eines gültigen Nachfolgers; null ist dann ein gültiger Indikator und kein Fehlerfall.

Die NullPointerException

Da sich hinter null kein Objekt verbirgt, ist es auch nicht möglich, eine Methode aufzurufen. Der Compiler kennt zwar den Typ jedes Objekts, aber erst die Laufzeitumgebung (JVM) weiß, was referenziert wird. Wird versucht, über die null-Referenz auf eine Eigenschaft eines Objekts zuzugreifen, löst eine JVM eine NullPointerException [Der Name zeigt das Überbleibsel von Zeigern. Zwar haben wir es in Java nicht mit Zeigern zu tun, sondern mit Referenzen, doch heißt es NullPointerException und nicht NullReferenceException. Das erinnert daran, dass eine Referenz ein Objekt identifiziert und eine Referenz auf ein Objekt ein Pointer ist.] aus.

Listing 3.5 NullPointer.java

/*  1 */import java.awt.Point; 
/*  2 */ 
/*  3 */public class NullPointer 
/*  4 */{ 
/*  5 */  public static void main( String[] args ) 
/*  6 */  { 
/*  7 */    Point  p = null; 
/*  8 */    String s = null; 
/*  9 */ 
/* 10 */    p.setLocation( 1, 2 ); 
/* 11 */    s.length(); 
/* 12 */  } 
/* 13 */}

Wir beobachten eine NullPointerException, denn das Programm bricht bei p.setLocation() mit folgender Ausgabe ab:

java.lang.NullPointerException 
    at NullPointer.main(NullPointer.java:10) 
 Exception in thread "main"

Die Laufzeitumgebung teilt uns in der Fehlermeldung mit, dass sich der Fehler, die NullPointerException, in Zeile 10 befindet.

null-Referenzen testen

Wir wollen an dieser Stelle noch einmal auf die logischen Kurzschlussoperatoren und normalen logischen Operatoren zu sprechen kommen. Letztere werten Operanden nur so lange von links nach rechts aus, bis der Wert der Operation feststeht. Auf den ersten Blick scheint es nicht viel auszumachen, ob alle Teilausdrücke ausgewertet werden oder nicht, in einigen Ausdrücken ist es aber wichtig, wie das folgende Beispiel für die Variable s vom Typ String zeigt:

if ( s != null && s.length() > 0 ) 
  ...

Die Bedingung testet, ob s überhaupt auf ein Objekt verweist und ob die Länge echt größer 0 ist. Diese Schreibweise tritt häufig auf, und der Und-Operator zur Verknüpfung muss ein Kurzschlussoperator sein, da es in diesem Fall ausdrücklich darauf ankommt, dass die Länge nur dann bestimmt wird, wenn die Variable s überhaupt auf ein String-Objekt verweist und nicht null ist. Andernfalls bekämen wir bei s.length() eine NullPointerException, wenn jeder Teilausdruck ausgewertet würde und s gleich null wäre.



Ihr Kommentar

Wie hat Ihnen das <openbook> gefallen? Wir freuen uns immer über Ihre freundlichen und kritischen Rückmeldungen.






<< zurück
  Zum Katalog
Zum Katalog: Java ist auch eine Insel





Java ist auch eine Insel
Jetzt bestellen


 Ihre Meinung?
Wie hat Ihnen das <openbook> gefallen?
Ihre Meinung

 Tipp
Zum Katalog: Coding for Fun





 Coding for Fun


 Buchempfehlungen
Zum Katalog: Objektorientierte Programmierung





 Objektorientierte
 Programmierung


Zum Katalog: Einstieg in Eclipse 3.4






 Einstieg in
 Eclipse 3.4


Zum Katalog: Java 6 lernen mit Eclipse






 Java 6 lernen
 mit Eclipse


Zum Katalog: NetBeans Platform 6






 NetBeans
 Platform 6


Zum Katalog: Java und XML






 Java und XML


Zum Katalog: Visual C# 2008






 Visual C# 2008


Zum Katalog: IT-Handbuch für Fachinformatiker






 IT-Handbuch für
 Fachinformatiker


Zum Katalog: C++ von A bis Z






 C++ von A bis Z


 Shopping
Versandkostenfrei bestellen in Deutschland und Österreich
InfoInfo




Copyright © Galileo Press 2009
Für Ihren privaten Gebrauch dürfen Sie die Online-Version natürlich ausdrucken. Ansonsten unterliegt das <openbook> denselben Bestimmungen, wie die gebundene Ausgabe: Das Werk einschließlich aller seiner Teile ist urheberrechtlich geschützt. Alle Rechte vorbehalten einschließlich der Vervielfältigung, Übersetzung, Mikroverfilmung sowie Einspeicherung und Verarbeitung in elektronischen Systemen.


[Galileo Computing]

Galileo Press, Rheinwerkallee 4, 53227 Bonn, Tel.: 0228.42150.0, Fax 0228.42150.77, info@galileo-press.de