Docstoc

Erl uterungen zur Java-Programmierung(1)

Document Sample
Erl uterungen zur Java-Programmierung(1) Powered By Docstoc
					Allgemeine Informatik WS 2001/2002

8. Übung - Erläuterungen
„Einstieg in die Java-Programmierung“
Letzte Änderung am 08.12.2001

In diesen Erläuterungen werden wir fortgeschrittene Elemente der Objektorientierung in Java wie Festlegung von Zugriffsrechten und Klassenmethoden/-variablen kennenleren.

Zugriffsrechte
In unserem bisherigen Beispiel haben wir es den Benutzern unserer Klasse erlaubt, uneingeschränkt auf die in der Klasse definierten Attribute zuzugreifen. Dies haben wir mit der Angabe des Schlüsselwortes public vor den Attributen erreicht. Dies ist jedoch nicht immer gewünscht. Damit die Klasse von unerwünschten Datenmanipulationen von außerhalb geschützt ist, bietet Java zusätzliche Zugriffsrechte, durch die Attribute und Methoden nach außen hin versteckt werden können. Das Zugriffsrechte public besagt, daß auf unsere Attribute und Methoden aus allen Klassen zugegriffen werden kann, aus denen das Objekt selbst ansprechbar ist. Im Vergleich hierzu bedeutet private, daß der Zugriff nur innerhalb der Klasse erlaubt ist. Geben wir nichts an, werden die Zugriffsrechte auf einen Default-Wert gesetzt, welcher es lediglich erlaubt, Attribute und Methoden aus dem gleichen Package anzusprechen, abgeleitete Klassen haben keinen Zugriff. An dieser Stelle werden wir unsere Kreisklasse noch ein wenig verändern: Die Attribute erhalten nicht mehr das Zugriffsrecht public sondern den Default-Wert, in dem wir vor der Variablendefinition das Schlüsselwort public weglassen. Da sie nun von der aufrufenden Klasse nicht mehr zugreifbar sind, müssen wir eine neue und von außen zugreifbare Methode „aendereWerte“ definieren, durch die wir die Attribute (kontrolliert) ändern können.
public class Kreis { // Hier kommen unsere Attribute (ohne public) double x = 0; double y = 0; double r = 1; // //Unsere Attributen sind nicht mehr „public“

Hier 3 verschiedene Konstruktoren public Kreis() { } public Kreis( double x; double y; double r) { // Bei gleichen Namen werden die Objektattribute mit this. // angesprochen

Einstieg in die Java-Programmierung

Seite 1 von 2

this.x = x; this.y = y; this.r = r; } public Kreis (Kreis k) { x = k.x; y = k.y; r = k.r; } // Jetzt kommen unsere Methoden public void aendereWerte( double x; double y; double r) { this.x = x; this.y = y; this.r = r; } public double berechneUmfang() { return 2 * 3.14159 * r; } public double berechneFlaeche() { return 3.14159 * r*r; } }

Wir schreiben eine weitere Klasse KreisaApplet in einer eigenen Datei KreisApplet.java, in der wir verschiedene Kreisobjekte erzeugen.
import java.applet.* ; import java.awt.* ; public class KreisApplet extends Applet { public void paint(Graphics g) { double flaeche1, flaeche2; double umfang; // Erzeugen verschiedener Kreisobjekte Kreis k1 = new Kreis(); Kreis k2 = new Kreis(1.2, 3.3, 4.5); // Anwenden einiger Methoden der Kreisobjekte flaeche1 = k1.berechneFlaeche(); umfang = k2.berechneUmfang(); k1.aendereWerte(3.0,3.0,3.0); flaeche2 = k1.berechneFlaeche(); // Fangen wir mit den Werten mal was an, z.B. ausgeben g.drawString(“1.Flaeche von k1:“ + flaeche1,100,100); g.drawString(“2.Flaeche von k1:“ + flaeche2,100,130); g.drawString(“Umfang von k2:“ + umfang,100,160); } }

Einstieg in die Java-Programmierung

Seite 2 von 2

Klassenvariablen und Klassenmethoden
Im nächsten Schritt erklären wir den Unterschied von Klassenvariablen zu Instanzvariablen sowie von Klassenmethoden zu Instanzmethoden. Außerdem werden wir sehen, wie man Konstanten definiert Instanzvariablen sind Variablen, wie wir sie bereits kennengelernt und in unserem Kreisbeispiel benutzt haben. Jedes von der Kreisklasse erzeugte Objekt hat seine eigene spezifische Radiusvariable, die es mit keinem anderen teilen muss. Verändert man den Radius r des einen Kreises, z.B. des Kreisobjekts k1, so hat das keine Auswirkung auf die anderen Kreisobjekte. Im Gegensatz dazu gibt es eine Klassenvariable nur ein einziges Mal (die Klasse gibt es ja auch nur einmal). Sie ist in jedem Objekt zugreifbar, eine Veränderung innerhalb von k1 hat dann aber Auswirkungen auf alle Kreisobjekte. Man könnte eine Klassenvariable z.B. dazu nutzen, um mitzuzählen, wie viele Kreise erzeugt wurden. Eine Klassenvariable definiert man in der Klasse Kreis wie folgt:
public static double anzahlKreise

Wir könnten diese Variable mit 0 initialisieren und bei jedem Konstruktoraufruf um eins hoch zählen, um die Kreise zu zählen. Die Initialisierung findet hierbei nur einmal während der ganzen Laufzeit des Programms statt und nicht wie bei Instanzvariablen bei jedem Erzeugen des Objektes! Das Schlüsselwort static gibt dabei an, daß es sich hierbei um eine Klassenvariable handelt. Eine Konstante ist eine Variable, die unveränderlich ist (klingt etwas paradox, oder?), sie enthält einen festen Wert. Konstanten werden mit dem vorangestellten Schlüsselwort „final“ definiert. Im folgenden ein Beispiel für eine Konstantendefinition:
public final zahl = 1.7;

Wir nehmen uns einmal einen Ausschnitt der Klasse Kreis vor und erweitern sie um unsere Klassenvariable anzahlKreise und eine Konstante pi.
public class Kreis { // Hier kommen unsere Attribute // Unsere Klassenvariable mit Initialisierungswert 0 public static int anzahlKreise = 0; // pi ist Konstante (final) und Klassenvariable (static) public static final pi = 3.1415926535897932 ... ... // Hier 3 verschiedene Konstruktoren public Kreis() {

Einstieg in die Java-Programmierung

Seite 3 von 2

anzahlKreise++; } public Kreis( double x; double y; double r) { this.x = x; this.y = y; this.r = r; anzahlKreise++; } public Kreis (Kreis k) { x = k.x; y = k.y; r = k.r; anzahlKreise++; } // Jetzt kommen unsere Methoden public double berechneUmfang() { // Methode die pi verwendet return 2 * pi * r; } ... ... }

Der Zugriff auf anzahlKreise, z.B von der Klasse Kreisanwendung heraus, erfolgt über den Klassennamen, also.: „Kreis.anzahlKreise“. Klassenmethoden werden wie Klassenvariablen mit dem Schlüsselwort static deklariert und ebenfalls über den Klassennamen angesprochen. Genauso wie die Klassenvariablen gehören sie zur Klasse, nicht zu einem einzelnen spezifischen Objekt und können deshalb keine Instanzvariablen der Klasse verwenden! Um den Unterschied einer Instanzmethode und einer Klassenmethode etwas zu verdeutlichen, schreiben wir eine Methode zum Vergleich zweier Kreise, einmal als Instanzmethode und einmal als Klassenmethode. Dazu vergleichen wir die Radien beider Kreise, von denen derjenige mit dem größeren Radius zurückgegeben wird. Die Instanzmethode:
public Kreis findeGroesserenKreis(Kreis k) { if (r >= k.r) return this; else return k; }

Ein Aufruf dieser Methode gestaltet sich wie folgt:
Kreis ergebniskreis; Kreis k1 = new Kreis(); Kreis k2 = new Kreis(4.3, 2.1,0.2);

Einstieg in die Java-Programmierung

Seite 4 von 2

ergebniskreis = k1.findeGroesserenKreis(k2); // oder ( beide Versionen sind möglich) ergebniskreis = k2.findeGroesserenKreis(k1);

Die Klassenmethoden:
public static Kreis findeGroesserenKreis(Kreis k1, Kreis k2) { if (k1.r >= k2.r) return k1; else return k2; }

Und ein Aufruf dieser Methode sieht folgendermaßen aus:
Kreis ergebniskreis; Keis k1 = new Kreis(); Kreis k2 = new Kreis(4.3, 2.1,0.2); ergebniskreis = Kreis.findeGroesserenKreis(k1, k2);

Die Klasse Vector
Wir schließen die Behandlung von Klassen und Objekten in Java mit der Betrachtung einer sehr nützlichen Java-Klasse, der Klasse Vector, ab. Diese Klasse ist ähnlich einem Array sehr nützlich zum Speichern von Objekten, allerdings kann ein Vector im Vergleich zu Arrays „mitwachsen“, d.h. man muss ein Vector-Objekt nicht schon bei der Einrichtung mit „new“ auf eine bestimmte, unveränderliche Anzahl von Komponenten festlegen. Folgendes Beispiel veranschaulicht die Erzeugung eines Vector-Objektes: Beispiel:
Vector bunteKreise = new Vector(); Kreis roterKreis = new Kreis() bunteKreise.addElement(roterKreis); // Erzeugen eines Vectors // Eigenes Objekt erzeugen // Objekt dem Vector hinzu// fügen

Kreis k = (Kreis) bunteKreise.elementAt(i); // i-tes Element des Vectors // herauslesen

Den Vector können Sie mit einer einfachen Schleife durchlaufen lassen. Um zu wissen, wie oft dies geschehen soll, stellt die Klasse Vector eine Methode size() zur Verfügung, welche die Anzahl der im Vector enthaltenen Elemente zurückgibt. Zum Verwenden der Klasse Vector müssen Sie die Klasse java.util.Vector importieren.

Einstieg in die Java-Programmierung

Seite 5 von 2


				
DOCUMENT INFO
Jun Wang Jun Wang Dr
About Some of Those documents come from internet for research purpose,if you have the copyrights of one of them,tell me by mail vixychina@gmail.com.Thank you!