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.4 Neue Objekte erzeugen Zur nächsten ÜberschriftZur vorigen Überschrift

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, wird es Möglichkeiten geben, diese Zustände zu erfragen und zu ändern.

Im Folgenden wollen wir untersuchen, wie sich von der Klasse Point zur Laufzeit Exemplare erzeugen lassen und wie der Zugriff auf die Eigenschaften der Point-Objekte aussieht.


Galileo Computing - Zum Seitenanfang

3.4.1 Anlegen eines Exemplars einer Klasse mit dem new-Operator Zur nächsten ÜberschriftZur vorigen Überschrift

Objekte müssen in Java immer ausdrücklich erzeugt werden. Dazu definiert die Sprache den new-Operator.


Beispiel Anlegen eines Punkt-Objekts:

new java.awt.Point();

Hinter dem new-Operator folgt der Name der Klasse, von der ein Exemplar erzeugt werden soll. Der Klassenname ist hier voll qualifiziert angegeben, da sich Point in einem Paket java.awt befindet. (Ein Paket ist eine Gruppe zusammengehöriger Klassen. Wir werden später mit den import-Deklarationen sehen, dass Entwickler diese Schreibweise auch abkürzen können.) Hinter dem Klassennamen folgt ein Paar runde Klammern für den Konstruktoraufruf. Dieser ist eine Art Methodenaufruf, über den sich Werte für die Initialisierung des frischen Objektes übergeben lassen.

Konnte die Speicherverwaltung von Java für das anzulegende Objekt freien Speicher reservieren und konnte der Konstruktor gültig durchlaufen werden, gibt der new-Ausdruck anschließend eine Referenz auf das frische Objekt an das Programm zurück.

Zusammenhang von new, Heap und Garbage-Collector

Bekommt das Laufzeitsystem die Anfrage, ein Objekt mit new zu erzeugen, so reserviert es so viel Speicher, dass alle Objekteigenschaften und Verwaltungsinformationen dort Platz haben. Ein Point-Objekt speichert die Koordinaten in zwei int-Werte, also sind mindestens 2 mal 4 Byte nötig. Den Speicherplatz nimmt die Laufzeitumgebung vom Heap. Der hat eine vordefinierte Maximalgröße (standardmäßig 64 MB), damit ein Java-Programm nicht beliebig viel Speicher vom Betriebssystem abgreifen kann, was die Maschine möglicherweise in den Ruin treibt.

Wird das Objekt nicht mehr vom Programm referenziert, so bemerkt dies der Garbage-Collector (GC) und gibt den reservierten Speichern wieder frei. [Mit dem gesetzten java-Schalter -verbose:gc für gibt es immer Konsolenausgaben, wenn der GC nicht mehr referenzierte Objekte erkennt und wegräumt.] Der GC testet dazu regelmäßig, ob die Objekte auf dem Heap noch benötigt werden, und wenn nicht, werden sie gelöscht. Es weht also immer ein Hauch von Friedhof über dem Heap, und blitzschnell nachdem die letzte Referenz vom Objekt genommen wird, ist es auch schon tot.

Ist das System nicht in der Lage, genügend Speicher für ein neues Objekt bereitzustellen, versucht der GC in einer letzten Rettungsaktion, alles wegzuräumen. Ist dann immer noch nicht ausreichend Speicher frei, generiert die Laufzeitumgebung einen OutOfMemoryError und bricht die Abarbeitung ab. [In diesem Fall ist aber ein new im Spiel, denn der Compiler generiert selbstständig zum Beispiel beim Ausdruck s + t einen Ausdruck wie new StringBuilder().append(s).append(t).toString().]


Hinweis Es gibt in Java nur wenige Sonderfälle, wann neue Objekte nicht über den new-Operator angelegt werden. So erzeugt die auf nativen Funktionen basierende Methode newInstance() vom Class- oder Constructor-Objekt ein neues Objekt. Auch clone() kann ein neues Objekt als Kopie eines anderen Objekts erzeugen. Bei der String-Konkatenation mit + ist für uns zwar kein new-Operator zu sehen, doch der Compiler wird ein new einsetzen, um das neue String-Objekt anzulegen. [§ 3.5 der JVM-Spezifikation, http://java.sun.com/docs/books/jvms/second_edition/html/Overview.doc.html#1732.]


Heap und Stack

Die JVM-Spezifikation sieht für Daten fünf verschiedene Speicherbereiche (engl. runtime data area) vor. Neben dem Heap-Speicher wollen wir uns den Stack-Speicher (Stapelspeicher) kurz anschauen. Den nutzt die Java Laufzeitumgebung zum Beispiel für lokale Variablen. Auch verwendet Java den Stack beim Methodenaufruf mit Parametern. Die Argumente kommen vor dem Methodenaufruf auf den Stapel, und die aufgerufene Methode kann über den Stack auf die Werte lesend oder schreibend zugreifen. Bei endlosen rekursiven Methodenaufrufen ist irgendwann die maximale Stackgröße erreicht, und es kommt zu einer Exception vom Typ java.lang.StackOverflowError. Da mit jedem Thread ein JVM-Stack assoziiert ist, bedeutet das das Ende des Threads.


Galileo Computing - Zum Seitenanfang

3.4.2 Deklarieren von Referenzvariablen Zur nächsten ÜberschriftZur vorigen Überschrift

Das Ergebnis des new-Operators ist eine Referenz auf das neue Objekt. Die Referenz wird in der Regel in einer Referenzvariablen zwischengespeichert, um fortlaufende Eigenschaften vom Objekt nutzen zu können.


Beispiel Deklariere zunächst die Variable p vom Typ java.awt.Point. Die Variable p nimmt anschließend die Referenz vom über das mit new angelegte neue Objekt auf.

java.awt.Point p; 
p = new java.awt.Point();

Die Deklaration und Initialisierung einer Referenzvariablen lassen sich kombinieren (auch eine lokale Referenzvariable ist zu Beginn uninitialisiert):

java.awt.Point p = new java.awt.Point();

Die Typen müssen natürlich kompatibel sein, und ein Haus-Objekt geht nicht vom Typ einer Socke durch. Der Versuch einer Zuweisung eines Punktobjekts an eine int- oder String-Variable ergibt einen Compilerfehler.

int    p = new java.awt.Point(); // Type mismatch: cannot convert from Point to int 
String s = new java.awt.Point(); // Type mismatch: cannot convert from Point to int

Damit speichert eine Variable entweder einen einfachen Wert (Variable vom Typ int, boolean, double …) oder einen Verweis auf ein Objekt. Referenztypen gibt es in drei Ausführungen: Klassentypen, Schnittstellentypen (auch Interface-Typen genannt) und Feldtypen (auch Array-Typen genannt). In unserem Beispiel haben wir ein Beispiel für einen Klassentyp.

Eclipse-Icon Strg + 1 ermöglicht es, entweder eine neue lokale Variable oder eine Objektvariable für den Ausdruck anzulegen.


Galileo Computing - Zum Seitenanfang

3.4.3 Zugriff auf Variablen und Methoden mit dem ».« Zur nächsten ÜberschriftZur vorigen Überschrift

Die in einer Klasse deklarierten Variablen heißen Objektvariablen beziehungsweise Exemplar-, Instanz- oder Ausprägungsvariablen. Wird ein Objekt geschaffen, dann erhält es seinen eigenen Satz von Objektvariablen. [Es gibt auch den Fall, dass sich mehrere Objekte eine Variable teilen, sogenannte statische Variablen. Diesen Fall werden wir später betrachten.] Sie bilden den Zustand des Objekts.

Der Punktoperator ».« erlaubt auf Objekten den Zugriff auf die Methoden oder Variablen. Er steht zwischen einem Ausdruck, der eine Referenz zurückgibt, [Sprachlich wird diese Formulierung gerne mit »Rechts steht eine Referenz« abgekürzt.] und der Objekteigenschaft. Welche Möglichkeiten eine Klasse genau bietet, erfährt der Entwickler in der API-Dokumentation.


Beispiel Die Variable p referenziert ein java.awt.Point-Objekt. Die Objektvariablen x und y sollen initialisiert werden.

java.awt.Point p = new java.awt.Point(); 
p.x = 1; 
p.y = 2 + p.x;

Eclipse-Icon Strg + Leertaste zeigt an, welche Eigenschaften eine Referenz ermöglicht. Eine Auswahl mit Return wählt die Eigenschaft aus und setzt insbesondere bei Methoden den Cursor zwischen das Klammerpaar.

Ein Methodenaufruf gestaltet sich genauso einfach wie ein Variablenzugriff. Hinter dem Ausdruck mit der Referenz folgt nach dem Punkt der Methodenname.

Das nachfolgende Beispiel erzeugt einen Punkt, belegt ihn mit Werten und gibt eine String-Repräsentation des Objektes aus.

Listing 3.1 MyPoint.java

class MyPoint 
{ 
  public static void main( String[] args ) 
  { 
    java.awt.Point p = new java.awt.Point(); 
    p.x = p.y = 12; 
    p.translate( –3, 2 ); 
 
    java.awt.Point q = new java.awt.Point(); 
    q.setLocation( 10, 100 ); 
 
    System.out.println( p.toString() );   // java.awt.Point[x=9,y=14] 
    System.out.println( q.toString() );   // java.awt.Point[x=10,y=100] 
  } 
}

Im ersten Fall belegen wir die Variablen x, y explizit und verschieben dann mit translate() die Koordinaten um –3, 2. Die Methode verändert die Zustände, was das spätere toString() anschaulich zeigt. Im zweiten Fall setzen wir nicht direkt die Objektzustände über die Variablen, sondern verändern die Zustände über die Methode setLocation(). Die beiden Objekte besitzen eigene Koordinaten und kommen sich nicht in die Quere.


Tipp Anstatt für die Ausgabe explizit println(obj.toString()) aufzurufen, funktioniert auch ein println(obj). Das liegt daran, dass die Signatur println(Object) jedes beliebige Objekt als Argument akzeptiert und auf diesem Objekt automatisch die toString()-Methode aufruft.


Abbildung 3.2 Die Abhängigkeit, dass MyPoint einen java.awt.Point nutzt, zeigt das UML-Diagramm mit einer gestrichelten Linie an. Die Parameterliste und Rückgabe sind in UML optional und hier nicht dargestellt.

Eclipse-Icon Strg + Leertaste auf einem Eigenschaftennamen (oder bei einer Methoden im Klammerpaar) zeigt die API-Dokumentation in einem kleinen Fenster an.

Nach dem Punkt geht’s weiter

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

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

Das String-Objekt besitzt selbst wieder Methoden. Eine davon ist length(), die die Länge der Zeichenkette liefert.

System.out.println( s.length() );            // 23

Das Erfragen des String-Objekts und dessen Länge können wir zu einer Anweisung verbinden – p sei wieder unser Point-Objekt:

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

Objekterzeugung ohne Variablenzuweisung

Bei der Nutzung von Objekteigenschaften muss der Typ links vom Punkt immer eine Referenz sein.

System.out.println( new Point().toString().length() ); // 23

Im Prinzip funktioniert auch Folgendes:

new java.awt.Point().x = 1;

Dies ist hier allerdings unsinnig, da zwar das Objekt erzeugt und ein Attribut gesetzt wird, anschließend das Objekt aber für den Garbage-Collector wieder Freiwild ist. Interessant ist die Anwendung zum Beispiel bei einem File-Objekt, um etwa herauszufinden, wie groß eine Datei ist:

long size = new java.io.File( "file.txt" ).length();

Galileo Computing - Zum Seitenanfang

3.4.4 Konstruktoren nutzen topZur vorigen Überschrift

Werden Objekte mit dem new-Operator angelegt, so wird ein Konstruktor aufgerufen, eine Art Methode mit besonderer Signatur. [Ein Konstruktor hat keinen Rückgabetyp und trägt auch denselben Namen wie die Klasse.] 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 auch »No-Arg-Konstruktor« genannt).


Beispiel Die folgenden Zeilen erzeugen schlussendlich drei Point-Objekte mit denselben Koordinaten. Die Variablen p1, p2 und p3 referenzieren jedoch immer neue Objekte; lediglich die Belegung der x- und y-Koordinaten ist bei den drei Objekten gleich.

java.awt.Point p1 = new java.awt.Point(); 
p1.setLocation( 10, 10 ); 
System.out.println( p1 );  // java.awt.Point[x=10,y=10] 
java.awt.Point p2 = new java.awt.Point( 10, 10 ); 
System.out.println( p2 );  // java.awt.Point[x=10,y=10] 
java.awt.Point p3 = new java.awt.Point( p2 ); 
System.out.println( p3 );  // java.awt.Point[x=10,y=10]

Der erste Konstruktor ist der Standard-Konstruktor, der zweite und dritte ein parametrisierter Konstruktor.




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