• Keine Ergebnisse gefunden

Pakete und Sichtbarkeit Pakete

Im Dokument Einführung in Java (Seite 67-73)

Aufgabe 2.3 class Point {

3 OOP II : Vererbung

3.5 Pakete und Sichtbarkeit Pakete

//--- public class OpInstanceof {

public static void main(String[] args) { Shape shape[] = new Shape[4];

shape[0] = new Shape(10, 20);

shape[1] = new Circle(10, 20, 200);

shape[2] = new Text(10, 20, "Monday to Friday");

shape[3] = new BoldText(10, 20, "Sunday");

for(int i = 0; i < shape.length; i++)

System.out.println(shape[i] instanceof Text);

for(int i = 0; i < shape.length; i++) { if(shape[i] instanceof BoldText)

System.out.println("Bold: " + ((BoldText) shape[i]).s);

else if(shape[i] instanceof Text)

System.out.println(((Text) shape[i]).s);

} } }

Auf der Konsole false

false true true

Monday to Friday Bold: Sunday

3.5 Pakete und Sichtbarkeit Pakete

Pakete (Packages) dienen dazu, die Software eines größeren Projektes in inhaltlich zusammenhängende Bereiche einzuteilen. Jedes Paket entspricht dabei einer Klassen-Bibliothek. Java Klassen, die zu einem Paket gehören, lassen sich dann mit der schon bekannten "import"-Anweisung in ein Programm einbinden. Pakete können aus verschiedenen Quellcode-Dateien bestehen. Jede Quellcode-Datei, die zu einem Paket gehört, muss mit derselben Paketdeklaration beginnen. Alle Programmeinheiten einer Quellcode-Datei gehören auf jeden Fall zum gleichen Paket. Im folgenden Beispiel "PackageDemo" wird die folgende Verzeichnisstruktur benutzt:

<Pfad> // Pfad für PackageDemo

<Pfad>\demo // Subdirectory mit Klassen A und B

<Pfad>\demo\tools // Subdirectory mit Klasse C

Beispiel, PackageDemo (nach [1]) In Datei "<Pfad>\PackageDemo.java"

import demo.*;

import demo.tools.*;

public class PackageDemo {

public static void main (String args[]) { A a = new A();

B b = new B();

C c = new C();

a.Hello();

b.Hello();

c.Hello();

} }

In Datei "<Pfad>\demo\A.java"

package demo;

public class A {

public void Hello(){

System.out.println("--- A ---");

} }

In Datei "<Pfad>\demo\B.java"

package demo;

public class B {

public void Hello(){

System.out.println("--- B ---");

} }

In Datei "<Pfad>\demo\tools\C.java"

package demo.tools;

public class C {

public void Hello(){

System.out.println("--- C ---");

} }

Auf der Konsole --- A --- --- B --- --- C ---

Beim Übersetzen von "PackageDemo" prüft der Compiler selbsttätig, ob die ".class"-Dateien in den Packages "demo" und "demo.tools" noch aktuell sind. Andernfalls übersetzt er die zugehörigen Quelldateien erneut. Es wird übersetzt, wenn zu einer ".java"-Datei noch keine

".class"-Datei existiert oder eine ".java"-Datei neuer als die zugehörige ".class"-Datei ist.

− Wenn eine "package"-Anweisung verwendet wird, muss sie die erste Anweisung in der Quelldatei sein.

Klassen ohne "package"-Anweisung gehören zu einem namenlosen Default-Paket (default package).

Default-Pakete sind für kleinere Programmierprojekte gedacht, für die es sich nicht lohnt, eigene Packages anzulegen. In aller Regel gehören alle in einem Verzeichnis oder in einem Unterverzeichnis gespeicherte Klassen zu ein- und demselben Default-Paket.

Sichtbarkeit

Tabelle 3.1 gibt einen Überblick über die Sichtbarkeit von Daten und Methoden. Die Sichtbarkeit lässt sich mit Modifikatoren verändern (private, <default>, protected, public).

Tabelle 3.1 Sichtbarkeit von Daten und Methoden

private <default> protected public

In der Klasse X X X X

In einer abgeleiteten Klasse (X) X

Im Paket (package) X X X

Überall X

(X) = Mit Einschränkungen.

− Mit "private" vereinbarte Daten und Methoden sind nur in der eigenen Klasse sichtbar.

− Ohne Angabe eines Modifikators (<default>) vereinbarte Daten und Methoden sind nur im eigenen Paket sichtbar.

− Mit "protected" vereinbarte Daten und Methoden sind im eigenen Paket und mit Ein-schränkungen in abgeleiteten Klassen in anderen Paketen sichtbar.

− Mit "public" vereinbarte Daten und Methoden sind überall sichtbar.

Im Folgenden wollen wir den Zugriffsschutz von Membervariablen und Methoden mittels Modifikatoren an Hand eines Beispiels noch deutlicher machen. Für die weitere Diskussion gehen wir davon aus, dass sich die Klassen A, B und C im Paket x befinden und die Klassen D und E im Paket y. Die Klasse C im Paket x ist von der Klasse A abgeleitet. Ebenso ist die Klasse E im Paket y von der Klasse A abgeleitet. Die Klasse A im Paket x hat die Membervariable valueInA und die Methode methodInA(). Als Diskussionsgrundlage sollen diese zunächst den Zugriffsschutz "private", dann "<default>", dann "protected" und schließlich "public" haben.

Beispiel: ProtectedDemo

//--- package x --- package x;

public class A {

private int valueInA = 0;

private void methodInA() {

System.out.println("Method in A");

} }

package x;

public class B {

public void methodInB() { A refA = new A();

refA.valueInA = 5; // z1 refA.methodInA(); // z2 }

}

package x;

public class C extends A { public void methodInC() { valueInA = 2; // z1 methodInA(); // z2 A refA = new A();

refA.valueInA = 5; // z3 refA.methodInA(); // z4 }

}

// --- package y --- package y;

import x.A;

public class D {

public void methodInD() { A refA = new A();

refA.valueInA = 5; // z1 refA.methodInA(); // z2 }

}

package y;

import x.A;

public class E extends A { public void methodInE() { valueInA = 2; // z1 methodInA(); // z2 A refA = new A();

refA.valueInA = 5; // z3 refA.methodInA(); // z4 }

}

Zugriffsmodifikator "private":

Haben die Membervariablen und Methoden der Klasse A das Zugriffsrecht "private", so kann aus keiner der Klassen B, C, D und E auf die privaten Membervariablen und Methoden der Klasse A zugegriffen werden.

Zugriffsmodifikator "<default>":

Haben die Membervariablen und Methoden der Klasse A das Zugriffsrecht "<default>", so kann aus Klassen heraus, die im gleichen Paket liegen, zugegriffen werden. Die Zugriffe auf die Variable valueInA und die Methode methodInA() in den Klassen B und C sind also zulässig. Die Klassen D und E haben keinen Zugriff auf die Variable valueInA und die Methode methodInA() der Klasse A.

Zugriffsmodifikator "protected":

Haben die Membervariablen und Methoden der Klasse A das Zugriffsrecht "protected", so besteht gegenüber dem Zugriffsrecht "<default>" ein etwas erweiterter Zugriff. Auf Membervariablen und Methoden mit dem Zugriffsrecht "protected" kann aus Klassen im gleichen Paket zugegriffen werden, und zusätzlich können auch Subklassen in anderen Paketen auf die von der Vaterklasse geerbten Membervariablen und Methoden zugreifen.

Bedingung ist allerdings, dass nur auf die eigenen ererbten Membervariablen und Methoden zugegriffen wird. Wird jedoch in der Klasse E ein neues Objekt der Klasse A angelegt, so darf auf die protected geschützten Membervariablen und Methoden dieses Objekts nicht zugegriffen werden. Die Zugriffe z1 und z2 in der Klasse E sind also zulässig, die Zugriffe z3 und z4 sind jedoch nicht zulässig.

Zugriffsmodifikator "public":

Haben die Membervariablen und Methoden der Klasse A das Zugriffsrecht "public", so kann aus allen Klassen B, C, D und E auf die Membervariablen und Methoden der Klasse A zugegriffen werden.

3.6 Übungsaufgaben

Übungsaufgabe 3.1

Programmieren und testen Sie die in Bild 3.6 dargestellten Klassen. Mit den Klassen soll "main()" zu der gegebenen Textausgabe auf der Konsole führen.

class Konto {

Bild 3.6 Klassen "Konto" und "PrivatGirokonto"

public class Test {

public static void main(String[] args) {

PrivatGirokonto pGiro = new PrivatGirokonto(

32082455L, 20040020L,"Meyer, Boris",

"Alphaeck 12, 22624 Hamburg", 3.20, 6123.25);

pGiro.display();

} }

Auf der Konsole Meyer, Boris

Alphaeck 12, 22624 Hamburg Kontonr. 32082455

BLZ 20040020 Zinsen 3.2%

Kontostand 6123.25 DM

Im Dokument Einführung in Java (Seite 67-73)