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

 << zurück
Java ist auch eine Insel von Christian Ullenboom
Programmieren für die Java 2-Plattform in der Version 5
Java ist auch eine Insel

Java ist auch eine Insel
5., akt. und erw. Auflage
1454 S., mit CD, 49,90 Euro
Galileo Computing
ISBN 3-89842-747-1
gp Kapitel 3 Klassen und Objekte
  gp 3.1 Objektorientierte Programmierung
    gp 3.1.1 Warum überhaupt OOP?
    gp 3.1.2 Wiederverwertbarkeit
  gp 3.2 Klassen benutzen
    gp 3.2.1 Die Klasse Point
  gp 3.3 Die UML (Unified Modeling Language)
    gp 3.3.1 Hintergrund und Geschichte zur UML
    gp 3.3.2 Wichtige Diagrammtypen der UML
  gp 3.4 Anlegen und Nutzen eines Punktes
    gp 3.4.1 Definieren von Referenz-Variablen
    gp 3.4.2 Anlegen eines Exemplars einer Klasse mit dem new-Operator
    gp 3.4.3 Zugriff auf Variablen und Methoden mit dem ».«
    gp 3.4.4 Konstruktoren nutzen
  gp 3.5 Import und Pakete
  gp 3.6 Die API-Dokumentation
  gp 3.7 Mit Referenzen arbeiten
    gp 3.7.1 Die null-Referenz
    gp 3.7.2 Zuweisungen bei Referenzen
    gp 3.7.3 Funktionen mit nichtprimitiven Parametern
    gp 3.7.4 Gleichheit von Objekten und die Methode equals()
  gp 3.8 Arrays
    gp 3.8.1 Deklaration von Arrays
    gp 3.8.2 Arrays mit Inhalt
    gp 3.8.3 Die Länge eines Arrays über das Attribut length
    gp 3.8.4 Zugriff auf die Elemente über den Index
    gp 3.8.5 Array-Objekte erzeugen
    gp 3.8.6 Fehler bei Arrays
    gp 3.8.7 Arrays mit nicht-primitiven Elementen
    gp 3.8.8 Vorinitialisierte Arrays
    gp 3.8.9 Die erweiterte for-Schleife
    gp 3.8.10 Mehrdimensionale Arrays
    gp 3.8.11 Die Wahrheit über die Array-Initialisierung
    gp 3.8.12 Mehrere Rückgabewerte
    gp 3.8.13 Argument per Referenz übergeben
    gp 3.8.14 Arrays klonen
    gp 3.8.15 Feldinhalte kopieren
    gp 3.8.16 Die Klasse Arrays zum Vergleichen, Füllen und Suchen
    gp 3.8.17 Methode mit variabler Argumentanzahl (vararg)
  gp 3.9 Der Einstiegspunkt für das Laufzeitsystem main()
    gp 3.9.1 Kommandozeilen-Parameter ausgeben
    gp 3.9.2 Der Rückgabewert von main() und System.exit()
    gp 3.9.3 Parser der Kommandozeilenargumente Apache CLI
  gp 3.10 Eigene Pakete schnüren
    gp 3.10.1 Die package-Anweisung
    gp 3.10.2 Importieren von Klassen mit import
    gp 3.10.3 Paketnamen
    gp 3.10.4 Hierarchische Strukturen und das Default-Package
    gp 3.10.5 Klassen mit gleichen Namen in unterschiedlichen Paketen
    gp 3.10.6 Statisches Import
    gp 3.10.7 Eine Verzeichnisstruktur für eigene Projekte


Galileo Computing

3.4 Anlegen und Nutzen eines Punktedowntop

Von der Klasse Point werden zur Laufzeit Exemplare erzeugt, die Point-Objekte. Eine Klasse beschreibt also, wie ein Objekt aussehen soll. In einer Mengen- beziehungsweise Element-Beziehung ausgedrückt, entsprechen Objekte den Elementen und Klassen den Mengen, in denen die Objekte als Elemente enthalten sind. Diese Objekte haben Eigenschaften, die sich nutzen lassen. Wenn ein Punkt Koordinaten repräsentiert, dann wird es Möglichkeiten geben, diese Zustände zu erfragen und zu ändern.


Galileo Computing

3.4.1 Definieren von Referenz-Variablen  downtop

Eine Variable speichert entweder einen einfachen Wert oder einen Verweis auf ein Objekt. Bekannt ist die Deklaration einer Variablen für einen ganzzahligen Wert:

int i;

Links steht der Typ und rechts der Name der Variable. Bei Objekten ist das nicht anders, auch hier wird der Variablentyp und Variablenname benötigt.

Den Verweis auf ein Objekt speichert eine Referenz-Variable. Die Definition einer Referenz-Variablen bringt den Typ des Objekts und einen Variablennamen zusammen.


Beispiel   Definiere (deklariere) die Variable p vom Typ Point:
Point p;

Im oberen Beispiel deklarieren wir eine Variable p und teilen dem Compiler mit, dass diese Variable Referenzen vom Typ Point speichern soll. Falls es sich bei p um eine Objekt- oder Klassenvariable handelt, wird p anfangs mit der Null-Referenz (null) initialisiert, die auf kein Objekt verweist; als lokale Variable hätte p keinen vordefinierten Wert, sie ist undefiniert. Referenztypen können nicht in primitive Typen konvertiert werden und umgekehrt.


Galileo Computing

3.4.2 Anlegen eines Exemplars einer Klasse mit dem new-Operator  downtop

Durch die Deklaration einer Variablen mit dem Namen einer Klasse als Typ wird noch kein Exemplar erzeugt. Dazu müssen wir mit dem new-Operator explizit ein Objekt erzeugen. Hinter dem new-Operator folgt immer der Name der Klasse, von der ein Exemplar erzeugt werden soll, und ein Paar Klammern. Wir werden später sehen, dass hier ein spezieller Methodenaufruf (Konstruktoraufruf) stattfindet, bei dem wir auch Werte übergeben können.


Beispiel   Anlegen eines Objekts und Speichern der Referenz in der Variablen p
p = new Point();

Das tatsächliche Punkt-Objekt wird erst dynamisch, also zur Laufzeit, mit new erzeugt. Damit stellt das System Speicher für ein Point-Objekt bereit und speichert eine Referenz auf diesen reservierten Speicherblock in der Variablen p ab.

Die Deklaration der Variablen p und die separate Erzeugung eines Exemplars der Klasse Point lassen sich, wie bei der Deklaration primitiver Datentypen, auch kombinieren.


Beispiel   Deklaration mit Initialisierung
double pi = 3.1415926535;
Point p = new Point();

Eclipse

(Strg)+(1) ermöglicht, entweder eine neue lokale Variable oder Objektvariable für den Ausdruck anzulegen.

Abbildung
Hier klicken, um das Bild zu Vergrößern


Galileo Computing

3.4.3 Zugriff auf Variablen und Methoden mit dem ».«  downtop

Die in einer Klasse definierten Variablen werden »Objektvariablen« (auch »Exemplar-, Instanz- oder Ausprägungsvariablen«) genannt. Wird ein Objekt geschaffen, dann erhält es seinen eigenen Satz von Objektvariablen. Sie bilden einen Zustand.

Ist das Objekt angelegt, wird auf die Methoden oder Variablen mit einem ».« zugegriffen. Der Punkt (auch »Selektor« genannt) ist ein Operator und steht zwischen einem Ausdruck, der eine Referenz zurückgibt, und der Objekteigenschaft. (Der Punkt als Operator hat natürlich nichts mit der gleichnamigen Klasse zu tun.)


Beispiel   Folgende Zeilen erzeugen ein Point-Objekt, speichern eine Referenz auf dieses Objekt in der Variablen p und weisen den Objektvariablen x und y Werte zu.
Point p = new Point();
p.x = 12;
p.y = 45;

Eclipse

(Strg)+(Leertaste) zeigt an, welche Eigenschaften eine Referenz definiert. Eine Auswahl mit Return wählt die Eigenschaft aus und setzt insbesondere bei Funktionen den Cursor zwischen das Klammerpaar.

Abbildung
Hier klicken, um das Bild zu Vergrößern

Der Typ links vom Punkt muss immer eine Referenz sein. Im Prinzip funktioniert auch Folgendes:

new Point().x = 1;

Dies ist allerdings unsinnig, da zwar das Objekt erzeugt und ein Attribut gesetzt wird, anschließend aber der Garbage-Collector das Objekt wieder wegräumt. Für einen Methodenaufruf kann dies schon sinnvoller sein.

Ein Methodenaufruf gestaltet sich genauso einfach wie eine Objekterzeugung. Hinter dem Ausdruck mit der Referenz und dem Punkt folgt der Methodenname. Das nachfolgende Beispiel ist lauffähig und bindet zugleich noch die Point-Klasse aus dem Paket java.awt ein. Ein Paket ist eine Gruppe zusammengehöriger Klassen.

Listing 3.1   MyPoint.java

import java.awt.Point;
class MyPoint
{
  public static void main( String[] args )
  {
    Point p = new Point();
    p.x = p.y = 12;
    p.setLocation( –32 );
    System.out.println( p.toString() );   // java.awt.point[x=-3,y=2]
//    alternativ
//    System.out.println( p );
  }
}

Die letzte Anweisung ist gültig, da println() bei einem Objekt automatisch die toString()-Methode aufruft.

Abbildung
Hier klicken, um das Bild zu Vergrößern

Abbildung 3.2   Die eigene Klasse MyPoint nutzt java.awt.Point, was als Abhängigkeit im UML-Diagramm angezeigt werden kann. Die Parameter und Rückgabetypen sind in UML optional und hier nicht dargestellt.

Eclipse

(Strg)+(_____) auf einem Eigenschaftennamen (oder bei einer Funktion im Klammerpaar) bringt die API-Dokumentation hervor. Dazu muss allerdings das Java SDK eingebunden sein – das JRE reicht nicht, da bei ihm keine Dokumentation zu finden ist.

Abbildung
Hier klicken, um das Bild zu Vergrößern

Nach dem Punkt geht’s weiter

Die Funktion toString() liefert als Ergebnis ein String-Objekt, das den Zustand des Punkts preisgibt.

Point p = new Point();
String s = p.toString();
System.out.println( s );            // java.awt.Point[x=0,y=0]
System.out.println( s.length() );   // 23

Das String-Objekt besitzt selbst wieder Methoden, eine davon ist length(), die die Länge der Zeichenkette liefert. Das Erfragen des String-Objekts und dessen Länge können wir verbinden zu einer Anweisung – p sei wieder unser Point-Objekt.

System.out.println( p.toString().length() );

Der Punkt-Operator für den Zugriff auf Objekt- oder Klassenvariablen beziehungsweise -methoden sollte nicht durch Freiraum von dem Klassennamen oder dem Ausdruck für die Objektreferenz oder dem Methoden- beziehungsweise Variablennamen abgetrennt werden. So ist es vernünftiger, anstatt

p.                toString()      .                 length()

die Anweisung mit p.toString().length() zu programmieren. Obwohl der Java-Compiler auch Programmcode mit eingebetteten Kommentaren und Zeilenvorschüben akzeptiert, ist von Konstruktionen wie

p./* um wen geht es */toString()/* ich bin’s */.
/*meine Länge*/length()

dringend abzuraten.


Galileo Computing

3.4.4 Konstruktoren nutzen  toptop

Werden Objekte mit dem new-Operator angelegt, so wird ein Konstruktor aufgerufen, eine Art Methode mit besonderer Signatur. Bei der Schaffung eines Objekts sollen in der Regel die Objektvariablen initialisiert werden. Diese Initialisierung wird dazu in den Konstruktor gesetzt, um sicherzustellen, dass das neue Objekt einen sinnvollen Anfangszustand aufweist.

Ein Konstruktor ohne Argumente ist der Standard-Konstruktor (auch »Default-Konstruktor«, selten »No-Arg-Konstruktor« genannt).


Beispiel   Die folgenden Zeilen erzeugen schlussendlich zwei Point-Objekte mit denselben Koordinaten. Die Variablen p und q referenzieren jedoch zwei völlig getrennte Objekte; lediglich die Belegung der x- und y-Koordinaten ist bei den beiden Objekten »zufällig« gleich.
Point p = new Point();
p.setLocation( 10, 10 );
Point q = new Point( 10, 10 );
Der erste Konstruktor ist der Standard-Konstruktor, der zweite ein parametrisierter Konstruktor.

Was bei new passiert

Ein Konstruktoraufruf wird bei der Erschaffung eines Objekts durch den new-Operator ausgelöst. So erzeugt

Point p = new Point();

ein Exemplar der Klasse Point. Die Laufzeitumgebung von Java reserviert so viel Speicher, dass ein Point-Objekt dort Platz hat. Anschließend ruft die Laufzeitumgebung den Konstruktor auf und gibt eine Referenz auf das Objekt zurück, die im obigen Beispiel der Variablen p zugewiesen wird. Kann das System nicht genügend Speicher bereitstellen, so wird der GC aufgerufen. Kann dieser keinen freien Platz finden, generiert die Laufzeitumgebung einen OutOfMemoryError.




1  Es gibt auch den Fall, dass sich mehrere Objekte eine Variable teilen, so genannte statische Variablen. Diesen werden wir später betrachten.

2  Sprachlich wird diese Formulierung gerne abgekürzt zu »Rechts steht eine Referenz«.

3  Ein Konstruktor hat keinen Rückgabetyp und heißt auch immer so wie die Klasse.

 << zurück




Copyright © Galileo Press GmbH 2005
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 GmbH, Rheinwerkallee 4, 53227 Bonn, Tel.: 0228.42150.0, Fax 0228.42150.77, info@galileo-press.de