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 Imperative Sprachkonzepte
3 Klassen und Objekte
4 Der Umgang mit Zeichenketten
5 Eigene Klassen schreiben
6 Exceptions
7 Äußere.innere Klassen
8 Besondere Klassen der Java SE
9 Generics<T>
10 Architektur, Design und angewandte Objektorientierung
11 Die Klassenbibliothek
12 Einführung in die nebenläufige Programmierung
13 Einführung in Datenstrukturen und Algorithmen
14 Einführung in grafische Oberflächen
15 Einführung in Dateien und Datenströme
16 Einführung in die <XML>-Verarbeitung mit Java
17 Einführung ins Datenbankmanagement mit JDBC
18 Bits und Bytes und Mathematisches
19 Die Werkzeuge des JDK
A Die Klassenbibliothek
Stichwort

Download:
- openbook, ca. 24,5 MB
- Aufgaben, ca. 1,1 MB
- Programme, ca. 12,8 MB
Buch bestellen
Ihre Meinung?

Spacer
Java ist auch eine Insel von Christian Ullenboom
Das umfassende Handbuch
Buch: Java ist auch eine Insel

Java ist auch eine Insel
Galileo Computing
1308 S., 10., aktualisierte Auflage, geb., mit DVD
ca. 49,90 Euro, ISBN 978-3-8362-1802-3
Pfeil5 Eigene Klassen schreiben
Pfeil5.1 Eigene Klassen mit Eigenschaften deklarieren
Pfeil5.1.1 Attribute deklarieren
Pfeil5.1.2 Methoden deklarieren
Pfeil5.1.3 Die this-Referenz
Pfeil5.2 Privatsphäre und Sichtbarkeit
Pfeil5.2.1 Für die Öffentlichkeit: public
Pfeil5.2.2 Kein Public Viewing – Passwörter sind privat
Pfeil5.2.3 Wieso nicht freie Methoden und Variablen für alle?
Pfeil5.2.4 Privat ist nicht ganz privat: Es kommt darauf an, wer’s sieht *
Pfeil5.2.5 Zugriffsmethoden für Attribute deklarieren
Pfeil5.2.6 Setter und Getter nach der JavaBeans-Spezifikation
Pfeil5.2.7 Paketsichtbar
Pfeil5.2.8 Zusammenfassung zur Sichtbarkeit
Pfeil5.3 Statische Methoden und statische Attribute
Pfeil5.3.1 Warum statische Eigenschaften sinnvoll sind
Pfeil5.3.2 Statische Eigenschaften mit static
Pfeil5.3.3 Statische Eigenschaften über Referenzen nutzen? *
Pfeil5.3.4 Warum die Groß- und Kleinschreibung wichtig ist *
Pfeil5.3.5 Statische Variablen zum Datenaustausch *
Pfeil5.3.6 Statische Eigenschaften und Objekteigenschaften *
Pfeil5.4 Konstanten und Aufzählungen
Pfeil5.4.1 Konstanten über öffentliche statische finale Variablen
Pfeil5.4.2 Typ(un)sichere Aufzählungen *
Pfeil5.4.3 Aufzählungen mit enum
Pfeil5.5 Objekte anlegen und zerstören
Pfeil5.5.1 Konstruktoren schreiben
Pfeil5.5.2 Der vorgegebene Konstruktor (default constructor)
Pfeil5.5.3 Parametrisierte und überladene Konstruktoren
Pfeil5.5.4 Copy-Konstruktor
Pfeil5.5.5 Einen anderen Konstruktor der gleichen Klasse mit this() aufrufen
Pfeil5.5.6 Ihr fehlt uns nicht – der Garbage-Collector
Pfeil5.5.7 Private Konstruktoren, Utility-Klassen, Singleton, Fabriken
Pfeil5.6 Klassen- und Objektinitialisierung *
Pfeil5.6.1 Initialisierung von Objektvariablen
Pfeil5.6.2 Statische Blöcke als Klasseninitialisierer
Pfeil5.6.3 Initialisierung von Klassenvariablen
Pfeil5.6.4 Eincompilierte Belegungen der Klassenvariablen
Pfeil5.6.5 Exemplarinitialisierer (Instanzinitialisierer)
Pfeil5.6.6 Finale Werte im Konstruktor und in statischen Blöcken setzen
Pfeil5.7 Assoziationen zwischen Objekten
Pfeil5.7.1 Unidirektionale 1:1-Beziehung
Pfeil5.7.2 Bidirektionale 1:1-Beziehungen
Pfeil5.7.3 Unidirektionale 1:n-Beziehung
Pfeil5.8 Vererbung
Pfeil5.8.1 Vererbung in Java
Pfeil5.8.2 Spielobjekte modellieren
Pfeil5.8.3 Die implizite Basisklasse java.lang.Object
Pfeil5.8.4 Einfach- und Mehrfachvererbung *
Pfeil5.8.5 Die Sichtbarkeit protected
Pfeil5.8.6 Konstruktoren in der Vererbung und super()
Pfeil5.9 Typen in Hierarchien
Pfeil5.9.1 Automatische und explizite Typanpassung
Pfeil5.9.2 Das Substitutionsprinzip
Pfeil5.9.3 Typen mit dem instanceof-Operator testen
Pfeil5.10 Methoden überschreiben
Pfeil5.10.1 Methoden in Unterklassen mit neuem Verhalten ausstatten
Pfeil5.10.2 Mit super an die Eltern
Pfeil5.10.3 Finale Klassen und finale Methoden
Pfeil5.10.4 Kovariante Rückgabetypen
Pfeil5.10.5 Array-Typen und Kovarianz *
Pfeil5.11 Drum prüfe, wer sich ewig dynamisch bindet
Pfeil5.11.1 Gebunden an toString()
Pfeil5.11.2 Implementierung von System.out.println(Object)
Pfeil5.11.3 Nicht dynamisch gebunden bei privaten, statischen und finalen Methoden
Pfeil5.11.4 Dynamisch gebunden auch bei Konstruktoraufrufen *
Pfeil5.11.5 Eine letzte Spielerei mit Javas dynamischer Bindung und überschatteten Attributen *
Pfeil5.12 Abstrakte Klassen und abstrakte Methoden
Pfeil5.12.1 Abstrakte Klassen
Pfeil5.12.2 Abstrakte Methoden
Pfeil5.13 Schnittstellen
Pfeil5.13.1 Schnittstellen deklarieren
Pfeil5.13.2 Implementieren von Schnittstellen
Pfeil5.13.3 Markierungsschnittstellen *
Pfeil5.13.4 Ein Polymorphie-Beispiel mit Schnittstellen
Pfeil5.13.5 Die Mehrfachvererbung bei Schnittstellen *
Pfeil5.13.6 Keine Kollisionsgefahr bei Mehrfachvererbung *
Pfeil5.13.7 Erweitern von Interfaces – Subinterfaces
Pfeil5.13.8 Konstantendeklarationen bei Schnittstellen
Pfeil5.13.9 Initialisierung von Schnittstellenkonstanten *
Pfeil5.13.10 Abstrakte Klassen und Schnittstellen im Vergleich
Pfeil5.14 Zum Weiterlesen

Galileo Computing - Zum Seitenanfang

5.3 Statische Methoden und statische AttributeZur nächsten Überschrift

Exemplarvariablen sind eng mit ihrem Objekt verbunden. Wird ein Objekt geschaffen, erhält es einen eigenen Satz von Exemplarvariablen, die zusammen den Zustand des Objekts repräsentieren. Ändert eine Objektmethode den Wert einer Exemplarvariablen in einem Objekt, so hat dies keine Auswirkungen auf die Daten der anderen Objekte; jedes Objekt speichert eine individuelle Belegung. Es gibt jedoch auch Situationen, in denen Eigenschaften oder Methoden nicht direkt einem individuellen Objekt zugeordnet werden. Dazu gehören zum Beispiel die statischen Methoden:

Dazu gesellen sich Zustände, die nicht an ein individuelles Objekt gebunden sind:

  • Integer.MAX_VALUE ist die größte darstellbare int-Ganzzahl.
  • Math.PI bestimmt die Zahl 3,1415...
  • Font.MONOSPACED steht für einen Zeichensatz mit fester Breite.
  • MediaSize.ISO.A4 definiert die Größe einer DIN-A4-Seite mit 210 mm × 297 mm.

Diese genannten Eigenschaften sind keinem konkreten Objekt zugeordnet, sondern vielmehr der Klasse. Diese Art von Zugehörigkeit wird in Java durch statische Eigenschaften unterstützt. Da sie zu keinem Objekt gehören (wie Objekteigenschaften), nennen wir sie auch Klasseneigenschaften. Die Sinus-Methode ist ein Beispiel für eine statische Methode der Math-Klasse, und MAX_INTEGER ist ein statisches Attribut der Klasse Integer.


Galileo Computing - Zum Seitenanfang

5.3.1 Warum statische Eigenschaften sinnvoll sindZur nächsten ÜberschriftZur vorigen Überschrift

Statische Eigenschaften haben gegenüber Objekteigenschaften den Vorteil, dass sie im Programm ausdrücken, keinen Zustand vom Objekt zu nutzen. Betrachten wir noch einmal die statischen Methoden aus der Klasse Math. Wenn sie Objektmethoden wären, so würden sie in der Regel mit einem Objektzustand arbeiten. Die statischen Methoden hätten keine Parameter und nähmen ihre Arbeitswerte nicht aus den Argumenten, sondern aus dem internen Zustand des Objekts. Das macht aber keine Math-Methode. Um den Sinus eines Winkels zu berechnen, benötigen wir kein spezifisches Mathe-Objekt. Andersherum könnte eine Methode wie setName() eines Spielers nicht statisch sein, da der Name ganz individuell für einen Spieler gesetzt werden soll und nicht alle Spieler-Objekte immer den gleichen Namen tragen sollten.

Statische Methoden sind aus diesem Grund häufiger als statische Variablen, da sie ihre Arbeitswerte ausschließlich aus den Parametern ziehen. Statische Variablen werden in erster Linie als Konstanten verwendet.


Galileo Computing - Zum Seitenanfang

5.3.2 Statische Eigenschaften mit staticZur nächsten ÜberschriftZur vorigen Überschrift

Um statische Eigenschaften in Java umzusetzen, fügen wir vor der Deklaration einer Variablen oder einer Methode das Schlüsselwort static hinzu. Für den Zugriff verwenden wir statt der Referenzvariablen einfach den Klassennamen. In der UML sind statische Eigenschaften unterstrichen gekennzeichnet.

Deklarieren wir eine statische Methode und eine statische Variable für eine Klasse GameUtils. Die Methode soll testen, ob Bezeichner, die im Spiel etwa für die Gegenstände verwendet werden, korrekt sind; ein korrekter Bezeichner ist nicht zu lang und enthält kein Sonderzeichen. Die Konstante MAX_ID_LEN steht für die maximale Bezeichnerlänge. Die Variable ist mit dem Modifizierer final versehen, da MAX_ID_LEN eine Konstante ist, deren Wert später nicht mehr verändert werden soll:

Listing 5.19: GameUtils.java

public class GameUtils
{
public static final int MAX_ID_LEN = 20 /* chars */;

public static boolean isGameIdentifier( String name )
{
if ( name == null )
return false;

return name.length() <= MAX_ID_LEN && name.matches( "\\w+" );
}
}
Abbildung

Abbildung 5.11: Statische Eigenschaften werden in der UML unterstrichen.

Die statischen Eigenschaften werden mit dem Klassennamen GameUtils angesprochen:

Listing 5.20: GameUtilsDemo.java, main() Ausschnitt

System.out.println( GameUtils.isGameIdentifier( "Superpig" ) );    // true
System.out.println( GameUtils.isGameIdentifier( "Superpig II" ) ); // false
Tipp

Falls eine Klasse nur statische Eigenschaften deklariert, spricht nichts dagegen, einen privaten Konstruktor anzugeben – das verhindert den äußeren Aufbau von Objekten. Eigene Konstruktoren werden etwas später vorgestellt, sodass unsere Klasse diese Möglichkeit noch nicht nutzt.

Abschnitt 5.5.1, »Konstruktoren schreiben«, erklärt Konstruktoren genauer und erläutert auch weitere Anwendungsfälle für private Konstruktoren.

Gültigkeitsbereich, Sichtbarkeit und Lebensdauer

Bei statischen und nicht-statischen Variablen können wir deutliche Unterschiede in der Lebensdauer festmachen. Eine Objektvariable beginnt ihr Leben mit dem new, und sie endet mit dem GC. Eine statische Variable dagegen beginnt ihr Leben in dem Moment, in dem die Laufzeitumgebung die Klasse lädt und initialisiert. Das Leben der statischen Variable endet, wenn die JVM die Klasse entfernt und aufräumt. Der Zugriff auf statische Variablen ist immer in allen Blöcken gestattet, da ja auch in Objektmethoden die statische Variable »schon eher da war« als das Objekt selbst, denn ein new setzt ja die geladene Klassendefinition, die die statischen Variablen vorbereitet, voraus.


Galileo Computing - Zum Seitenanfang

5.3.3 Statische Eigenschaften über Referenzen nutzen? *Zur nächsten ÜberschriftZur vorigen Überschrift

Besitzt eine Klasse eine Klasseneigenschaft, so kann sie auch wie ein Objektattribut über die Referenz angesprochen werden. Dies bedeutet, dass es prinzipiell zwei Möglichkeiten gibt, wenn ein Objektexemplar existiert und die Klasse ein statisches Attribut hat. Bleiben wir bei unserem obigen Beispiel mit der Klasse GameUtils. Wir können für den Zugriff auf MAX_ID_LEN Folgendes schreiben:

Listing 5.21: GameUtilsDemo.java, main() Ausschnitt

System.out.println( GameUtils.MAX_ID_LEN );           // Genau richtig
GameUtils ut = new GameUtils();
System.out.println( ut.MAX_ID_LEN ); // Nicht gut

Zugriffe auf statische Eigenschaften sollten wir nie über die Objektreferenz schreiben, denn dem Leser ist sonst nicht klar, ob die Eigenschaft statisch oder nicht-statisch ist. Das zu wissen, ist aber wichtig. Aus diesem Grund sollten wir immer statische Eigenschaften über ihren Klassennamen ansprechen; Eclipse gibt hier auch eine Meldung aus, wenn wir es nicht so machen.

Hinweis

Bei statischen Zugriffen spielt die Referenz keine Rolle, und sie kann auch null sein. Wer im Wettbewerb um das schlechteste Java-Programm weit vorne sein möchte, der schreibt:

System.out.println( ((GameUtils) null).MAX_ID_LEN );


Galileo Computing - Zum Seitenanfang

5.3.4 Warum die Groß- und Kleinschreibung wichtig ist *Zur nächsten ÜberschriftZur vorigen Überschrift

Die Vorgabe der Namenskonvention besagt: Klassennamen sind mit Großbuchstaben zu vergeben und Variablennamen mit Kleinbuchstaben. Treffen wir auf eine Anweisung wie Math.max(a, b), so wissen wir sofort, dass max() eine statische Methode sein muss, weil davor ein Bezeichner steht, der großgeschrieben ist. Dieser kennzeichnet also keine Referenz, sondern einen Klassennamen. Daher sollten wir in unseren Programmen großgeschriebene Objektnamen meiden.

Das folgende Beispiel demonstriert anschaulich, warum Referenzvariablen mit Kleinbuchstaben und Klassennamen mit Großbuchstaben beginnen sollten:

String StringModifier = "What is the Matrix?";
String t = StringModifier.trim();

Die trim()-Methode ist nicht statisch, wie die Anweisung durch die Großschreibung der Variable suggeriert.

Das gleiche Problem haben wir, wenn wir Klassen mit Kleinbuchstaben benennen. Auch dies kann irritieren:

class player
{
static void move() { }
}

Jetzt könnte jemand player.move() schreiben, und der Leser nähme an, dass player wegen seiner Kleinschreibung eine Referenzvariable ist und move() eine Objektmethode. Wir sehen an diesem Beispiel, dass es wichtig ist, sich an die Groß-/Kleinschreibung zu halten.


Galileo Computing - Zum Seitenanfang

5.3.5 Statische Variablen zum Datenaustausch *Zur nächsten ÜberschriftZur vorigen Überschrift

Der Wert einer statischen Variable wird bei dem Klassenobjekt gespeichert und nicht bei einem Exemplar der Klasse. Wie wir aber gesehen haben, kann jedes Exemplar einer Klasse auch auf die statischen Variablen der Klasse zugreifen. Da eine statische Variable aber nur einmal pro Klasse vorliegt, führt dies dazu, dass mehrere Objekte sich eine Variable teilen. Ist etwa das Attribut PI statisch und size ein Objektattribut, so ergibt sich bei zwei Exemplaren folgendes Bild:

Abbildung

Abbildung 5.12: Zwei Klassen teilen sich das statische Attribut PI.

Während also beide Exemplare das gleiche PI nutzen, können beide Exemplare size völlig unterschiedlich belegen.

Mit diesem Wissen wird es möglich, einen Austausch von Informationen über die Objektgrenze hinaus zu erlauben:

Listing 5.22: ShareData.java

public class ShareData
{
private static int data;

public void memorize( int data )
{
ShareData.data = data;
}

public int retrieve ()
{
return data;
}
public static void main( String[] args )
{
ShareData s1 = new ShareData();
ShareData s2 = new ShareData();
s1.memorize( 2 );
System.out.println( s2.retrieve() ); // 2
}
}
Hinweis

Bei nebenläufigen Zugriffen auf statische Variablen kann es zu Problemen kommen. Deshalb müssen wir spezielle Synchronisationsmechanismen nutzen – die das Beispiel allerdings nicht verwendet. Statische Variablen können auch schnell zu Speicherproblemen führen, da Objektreferenzen sehr lange gehalten werden. Der Einsatz muss wohldurchdacht sein.

Abbildung
Galileo Computing - Zum Seitenanfang

5.3.6 Statische Eigenschaften und Objekteigenschaften *Zur nächsten ÜberschriftZur vorigen Überschrift

Wie wir oben gesehen haben, können wir über eine Objektreferenz auch statische Eigenschaften nutzen. Wir wollen uns aber noch einmal vergewissern, wie Objekteigenschaften und statische Eigenschaften gemischt werden können. Erinnern wir uns daran, dass unsere ersten Programme aus der statischen main()-Methode bestanden, aber unsere anderen Methoden auch static sein mussten. Dies ist sinnvoll, da eine statische Methode – ohne explizite Angabe eines aufrufenden Objekts – nur andere statische Methoden aufrufen kann. Wie sollte auch eine statische Methode eine Objektmethode aufrufen können, wenn es kein zugehöriges Objekt gibt? Andersherum kann aber jede Objektmethode eine beliebige statische Methode direkt aufrufen. Genauso verhält es sich mit Attributen. Eine statische Methode kann keine Objektattribute nutzen, da es kein implizites Objekt gibt, auf dessen Eigenschaften zugegriffen werden könnte.

»this«-Referenzen und statische Eigenschaften

Auch der Einsatz der this-Referenz ist bei statischen Eigenschaften nicht möglich. Eine statische Methode kann also keine this-Referenz verwenden:

Listing 5.23: InStaticNoThis.java

class InStaticNoThis
{
String name;

static void setName()
{
name = "Amanda"; // Fehler Compilerfehler
this.name = "Amanda"; // Fehler Compilerfehler
}
}


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

 Buchempfehlungen
Zum Katalog: Java 7 – Mehr als eine Insel





 Java 7 –
 Mehr als eine Insel


Zum Katalog: Android 3






 Android 3


Zum Katalog: Android-Apps entwickeln






 Android-Apps
 entwickeln


Zum Katalog: NetBeans Platform 7






 NetBeans
 Platform 7


Zum Katalog: Einstieg in Eclipse 3.7






 Einstieg in
 Eclipse 3.7


Zum Katalog: Einstieg in Java






 Einstieg
 in Java


Zum Katalog: Einstieg in Java 7






 Einstieg in
 Java 7


 Shopping
Versandkostenfrei bestellen in Deutschland und Österreich
InfoInfo




Copyright © Galileo Press 2011
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