YOU ARE HERE Pakete und Zugriffskontrolle Pakete in UML

23.03.2004
YOU ARE HERE ™
Pakete und Zugriffskontrolle
• Einführung
• Objektorientierte Modellierung
™ Java-Sprachkonstrukte
• Je größer das Software-Projekt, desto wichtiger die
gründliche Planung
•
•
•
•
•
•
•
•
•
• Grobstruktur sollte vor dem Projektstart überlegt werden,
nicht nachher
Pakete und Zugriffskontrolle
Deklaration von Methoden, Attributen, Variablen
Ausdrücke und Anweisungen
Kontrollstrukturen
Ausnahmebehandlung
• Modellierung mit UML kann Planung erheblich erleichtern
• Pakete: Mechanismus, um Programme besser zu
strukturieren
Java-Klassenbibliothek
Grafische Benutzungsoberflächen
Programmierstil
Zusammenfassung
¾ Grundvoraussetzung für erfolgreiche Programmierung im
Team
Java-Einführungskurs
1
Java-Einführungskurs
2
Pakete in UML
Zuordnung von Klassen zu Paketen
•
•
•
•
• Konvention zur Vermeidung von Paket-Namenskonflikten
Grobstrukturierung von größeren Projekten
Zusammenfassung „zusammengehöriger“ Klassen
Definition von Namensräumen für Klassen
Pakete können verschachtelt werden
• Voranstellung des inversen Domainnamens des Paketerstellers
• Klassen-Paket-Zuordnung mit package-Anweisung
• erste Anweisung einer .java-Datei
package de.lpz_ebusiness.Bibliothek.Daten;
Medium
Buch
public class Buch {
...
}
Journal
Daten
• .java- und .class-Files müssen in Verzeichnisstruktur
stehen, die der Paketstruktur entspricht
GUI
• z.B. /de/lpz_ebusiness/Bibliothek/Daten/Buch.java
Bibliothek
Java-Einführungskurs
3
Java-Einführungskurs
4
Zugriff auf Klassen in Paketen
Zugriffskontrolle
• Klassen aus anderen Paketen werden durch
Paketname.Klassenname angesprochen
package de.lpz_ebusiness.Bibliothek.Daten;
public class Buch {
private String autoren;
...
public String getAutoren () {...}
...
}
java.util.Date ausleihDatum = new java.util.Date();
• alternativ: Klasse(n) aus anderen Paketen mit importAnweisung lokal bekannt machen
import java.util.Date; // oder: import java.util.*
• Sichtbarkeitsmodifikatoren
public class Buch {
...
public ausleihen (...) {
...
Date ausleihDatum = new Date();
...
}
}
Java-Einführungskurs
• public:
Klasse/Attribut/Methode überall sichtbar
• ohne:
Klasse/Attribut/Methode nur in gleichem Paket
sichtbar
Attribut/Methode nur in gleichem Paket oder in
abgeleiteten Klassen sichtbar
Attribut/Methode nur in gleicher Klasse sichtbar
• protected:
• private:
5
Lehrstuhl für Angewandte Telematik/e-Business
Java-Einführungskurs
6
1
23.03.2004
Zusammenfassung
YOU ARE HERE ™
• Grobstrukturierung von Projekten in Paketen
• Einführung
• Objektorientierte Modellierung
• Java-Sprachkonstrukte
• Definieren Namensräume, Zugriffsbereiche
• Zugriffskontrolle über Sichtbarkeitsmodifikatoren
Verfügbarkeit \ Sichtbarkeit public protected
ohne
• Pakete und Zugriffskontrolle
™ Deklaration von Methoden, Attributen, Variablen
• Ausdrücke und Anweisungen
• Kontrollstrukturen
• Ausnahmebehandlung
private
gleiche Klasse
Ja
Ja
Ja
Ja
Klasse in gleichem Paket
Ja
Ja
Ja
Nein
Subklasse in fremdem Paket
Ja
Ja
Nein
Nein
Nichtsubklasse in fremdem Paket
Ja
Nein
Nein
Nein
Java-Einführungskurs
•
•
•
•
7
Java-Klassenbibliothek
Grafische Benutzungsoberflächen
Programmierstil
Zusammenfassung
Java-Einführungskurs
8
Klassendeklaration
Attributdeklaration
public class Buch {
...
}
Klassenname
public class Buch {
private String autoren;
private String titel;
private String verlag;
private int jahr;
...
}
Attributname
Schlüsselwort für Klassendekl.
Sichtbarkeitsmodifikator
• public
•
•
•
•
•
•
beginnt mit Großbuchstabe
besteht aus Unicode-Zeichen
praktisch beliebig lang
darf kein Schlüsselwort sein
Groß-/Kleinschreibung relevant!
Konvention: NameDerKlasse
•
•
•
•
•
•
Attribut-Datentyp
beginnt mit Kleinbuchstabe
besteht aus Unicode-Zeichen
praktisch beliebig lang
darf kein Schlüsselwort sein
Groß-/Kleinschreibung relevant!
Konvention: nameDesAttributs
• primitiver Typ
• ohne (Paket)
• Wahrheitswert
• Zeichen
• Zahl
Sichtbarkeitsmodifikator
• public
• Referenztyp
• String (Zeichenkette)
• Array (Feld)
• Klasse
• (Paket)
• protected
• private
Java-Einführungskurs
9
Java-Einführungskurs
10
Primitive Typen: Zahlen
Primitive Typen: Zeichen
• Wahrheitswert (Boolesche Logik)
• Zeichen (Unicode)
• boolean : true oder false
• char
• direkt:
• Escape-Sequenz:
• Unicode (hex):
• oktaler ASCII-Code:
• Ganzzahl (Zweierkomplement)
•
•
•
•
byte
short
int
long
–27...(27–1); dezimal: 42, hexadezimal: 0x2A, oktal: 052
–215...(215–1); dezimal, hexadezimal, oktal (s.o.)
–231...(231–1); dezimal, hexadezimal, oktal (s.o.)
–263...(263–1); dezimal: 100000000000L
• Escape-Sequenzen
•
•
•
•
•
•
•
•
• Fließkommazahl (IEEE 754)
• float 32 Bit; Dezimalbruch: 3.1415F, Exponent: -2.567E25F
• double 64 Bit; Dezimalbruch, 3.1415D, Exponent: 1.79E-308D
Java-Einführungskurs
'A'
'\"'
'\u0022'
'\42'
11
Lehrstuhl für Angewandte Telematik/e-Business
'\"'
'\''
'\\'
'\b'
'\t'
'\n'
'\f'
'\r'
Java-Einführungskurs
doppeltes Anführungszeichen
einfaches Anführungszeichen
Backslash
Backspace
(ASCII: 8)
Tabulator
(ASCII: 9)
Zeilenwechsel (ASCII: 10)
Seitenwechsel (ASCII: 12)
Wagenrücklauf (ASCII: 13)
12
2
23.03.2004
Referenztypen
Referenzen auf Objekte
• primitive Typen: Attribute enthalten Werte
• mehrere Referenzen können auf das gleiche Objekt zeigen
b
false
c
X
i
42
f
s
3,1415
a
:String
o
:Array
p
:Objekt
• komplexere Datenstrukturen werden als Objekte dargestellt
• String-Objekte, Array-Objekte, Objekte beliebiger Klassen
• Referenztypen: Attribute enthalten "Verweise" auf Objekte
s
a
o
p
• Garbage Collection zerstört nicht mehr referenzierte Objekte
¾ explizites "free" oder "delete" als Gegenstück zu new unnötig
null
s
:String
:Array
:Objekt
null-Literal:
Attribut enthält
keine Referenz
auf ein Objekt
Java-Einführungskurs
a
:String
13
o
:Array
null
p
null
:Objekt
Java-Einführungskurs
14
Klasse Object
Strings (Zeichenketten)
• alle Klassen haben Oberklasse Object
• wichtige von Object geerbte Methoden
• Zeichenketten werden durch Objekte der besonderen
Klasse String dargestellt
• keine explizite Instanziierung notwendig
• public String toString ()
• gibt textuelle Repräsentation des Objekts aus
• im Original Ausgabe von Klassenname und Objekt-Hashcode
• sollte überschrieben werden, um Inhalt der Objektattribute
auszugeben
• wird implizit aufgerufen, wenn man ein Objekt an
System.out.println() übergibt – hilfreich zum Testen
• public boolean equals (Object obj)
• vergleicht das Objekt mit dem in obj übergebenen Objekt
• im Original nur Vergleich der Referenzen this und obj
• direkte Zuweisung von Literalen möglich
• String autor1 = "Doberkat";
• String autor2 = "Dißmann";
• Zeichencodierung in Strings analog zu char-Literalen
• "Preis: \u20AC 123,45" Æ Preis: € 123,45
• Achtung: char-Literale stehen in einfachen,
String-Literale in doppelten Anführungszeichen!
• sollte überschrieben werden, um Objektattribute inhaltlich zu
vergleichen
• weitere, systemnähere Methoden (hier nicht weiter betrachtet)
Java-Einführungskurs
• mehr über die Fähigkeiten der String-Klasse später
15
Java-Einführungskurs
16
Arrays (Felder)
Arrays: Beispiel
• Sammlung von Werten des gleichen Typs, wobei auf jeden
Wert über einen Index zugegriffen werden kann
• Deklaration
• getrennte Deklaration, Instanziierung und Initialisierung:
String[] autoren;
// Deklaration
autoren = new String[3]; // Instanziierung
• Typ[] feldname;
• Typ kann primitiver Datentyp, String oder Klasse sein
autoren[0] = "Gosling";
autoren[1] = "Joy";
autoren[2] = "Steele";
• Instanziierung
• feldname = new Typ[Größe];
• Instanziierung mit Initialisierung
// Initialisierung durch
//
individuellen Zugriff auf
//
einzelne Elemente
• Deklaration, Instanziierung und Initialisierung in einem:
• feldname = new Typ[] {Wert0, Wert1, ..., Wertn};
String[] autoren = new String[] {"Gosling", "Joy", "Steele"};
• Zugriff auf bestimmtes Feldelement
• feldname[Index]
• Bestimmung der Feldlänge
• feldname.length
Java-Einführungskurs
17
Lehrstuhl für Angewandte Telematik/e-Business
Java-Einführungskurs
18
3
23.03.2004
Mehrdimensionale Arrays: Erzeugung
Mehrdimensionale Arrays: Zugriff
• Deklaration
• Referenz auf bestimmtes Feldelement
• Typ[][] feldname;
• feldname[Index0][Index1]
• Zahl der Klammerpaare bestimmt Zahl der Dimensionen
• Referenz auf (n-1)-dimensionales Teilfeld
• Instanziierung
• feldname[Index0]
• feldname = new Typ[Größe0][Größe1];
• Referenz auf n-dimensionales Gesamtfeld
• Instanziierung nicht rechteckiger Arrays
• feldname
• Größe einer Dimension abhängig vom Index der "Oberdimension"
• feldname = new Typ[Größe0][];
feldname[Index0] = new Typ[GrößeIndex0];
• Feldlänge der äußeren Dimension
• feldname.length
• Instanziierung mit Initialisierung
• Feldlänge der nächst-tieferen Dimension
• feldname = new Typ[][] {
{Wert00, Wert01, ..., Wert0n},
{Wert10, Wert11, ..., Wert1n}
};
• feldname[Index0].length
Java-Einführungskurs
19
Java-Einführungskurs
20
Methodendeklaration
Methodendeklaration: Parameter
import java.util.Date;
• Inhalt der Parameterliste
• Typen der Parameter, die der Methode übergeben werden müssen
• Namen, unter denen sie in der Methode angesprochen werden
Parameterliste
public class Buch {
...
Methodenrumpf
public Buch (...) {...}
public
public
public
public
...
}
int ausleihen (...) {...}
• beginnt mit Kleinbuchstabe
void zurueckgeben (...) {...}
• besteht aus Unicode-Zeichen
void vormerken (...) {...}
• praktisch beliebig lang
Date verlaengern (...) {...}
• darf kein Schlüsselwort sein
• Groß-/Kleinschreibung relevant!
Methodenname
• Konvention: nameDerMethode
Rückgabe-Datentyp
• Referenztyp
• String (Zeichenkette)
• Array (Feld)
• Klasse
Java-Einführungskurs
• Methodenaufruf mit Parametern als Literale oder Variable
Buch javaLehrbuch = new Buch ("Doberkat, Dißmann",
"Einführung in die OOP mit Java", "Oldenbourg", 1999);
...
int zeitraum = 14;
Date rueckgabeTermin = javaLehrbuch.verlaengern (zeitraum);
• primitiver Typ
• Wahrheitswert
• Zeichen
• Zahl
Sichtbarkeitsmodifikator
• public
• (Paket)
• protected
• private
public Buch (String initAutor, String initTitel,
String initVerlag, int initJahr) {...}
public void zurueckgeben () {...}
public Date verlaengern (int tage) {...}
21
Java-Einführungskurs
22
Parameterübergabe per Wert
Parameterübergabe per Referenz
• bei primitiven Typen
• bei Referenztypen
• beim Aufrufen einer Methode werden die Parameterwerte
vom aufrufenden Programmteil in die Methode kopiert
¾ Wertänderungen der Parameter in der Methode
wirken sich nicht auf Werte außerhalb der Methode aus
• beim Aufrufen einer Methode werden die Verweise auf die Objekte
vom aufrufenden Teil in die Methode kopiert, nicht die Objekte selbst
¾ Veränderungen der Objekte in der Methode
wirken sich auf Objekte außerhalb der Methode aus!
aufrufender Teil
aufrufender Teil
methode(int innen)
aussen
innen
methode(aussen);
innen = 84;
42
42
42
84
methode(aussen);
innen
:obj
n: 42
innen.n = 84;
42
aussen
:obj
n: 42
aussen.n = 42;
42
int aussen = 42;
methode(obj innen)
:obj
n: 84
:obj
n: 84
Java-Einführungskurs
23
Lehrstuhl für Angewandte Telematik/e-Business
Java-Einführungskurs
24
4
23.03.2004
Methodensignatur
Überladen von Methoden
• Methoden werden über ihre Signatur identifiziert
• Möglichkeit, unterschiedliches Methodenverhalten in
Abhängigkeit von den gegebenen Parametern zu definieren
• gleicher Methodenname, verschiedene Parameterlisten
• bestehend aus Methodenname, Anzahl und Typen der Parameter
• aber nicht Parameternamen und Rückgabetyp
• Beispiele
public Date verlaengern (int tage) {
...
// Benutzerdefinierte Verlaengerung
leihFrist = leihFrist + tage;
...
}
• verschiedene Methodennamen Æ verschiedene Signaturen
public void ausleihen () {...}
public void zurueckgeben () {...}
• gleiche Methodennamen, Parametertypen Æ gleiche Signaturen
Æ Compiler-Fehlermeldung
public Date verlaengern () {
...
// Default-Verlaengerungsfrist (2 Wochen)
leihFrist = leihFrist + 14;
...
}
public void vormerken (String benutzerName) {...}
public boolean vormerken (String vormerkName) {...}
• verschiedene Parametertypen Æ verschiedene Signaturen
public Date verlaengern (int tage) {...}
public Date verlaengern () {...}
Java-Einführungskurs
25
Java-Einführungskurs
26
Überladen von Konstruktoren
Beenden von Methoden
• genau wie bei Methoden möglich
• return-Anweisung beendet Methodenausführung und gibt
Wert zurück
• beliebte Technik für Initialisierungsvarianten von Objekten
public Date verlaengern () {
...
Date rueckgabeTermin = new Date();
...
return rueckgabeTermin;
}
• wird kein Konstruktor deklariert,
so wird implizit ein leerer Standardkonstruktor verwendet
public class Leer {
}
⇔
public class Leer {
public Leer () {}
}
• Bei Methoden ohne Rückgabewert (void) kann die
Anweisung weggelassen oder ohne Variable (return;)
angegeben werden
• Verwendung mehrerer return-Anweisungen in einer
Methode möglich
• wird ein Konstruktor mit Parametern deklariert,
so muss der leere Konstruktor explizit zusätzlich deklariert
werden, um ebenfalls verwendet werden zu können
Java-Einführungskurs
27
Java-Einführungskurs
Variablen
Variablen: Initialisierung
• speichern (wie Attribute) veränderliche Werte versch. Typen
• werden jedoch innerhalb einer Methode deklariert und
existieren daher nur während der Ausführung der Methode!
• Deklaration
• Zuweisung von Werten an Variablen mit Operator =
• vor Verwendung muss der Typ der Variablen festgelegt werden,
d.h. welche Werte sie annehmen kann
• alle primitiven Typen und Referenztypen möglich
• kein Sichtbarkeitsmodifikator, da immer auf Methode begrenzt
• mehrere Variablen gleichen Typs komma-getrennt aufführbar
public void methode () {
...
dez = -42;
hex = 0xFFD6;
autoren = new String[2];
autoren[0] = "Doberkat";
autoren[1] = "Dißmann";
rueckgabeTermin = new Date();
...
}
• Kombination von Deklaration und Initialisierung
public void methode () {
int dez = -42, hex = 0xFFD6;
String[] autoren = new String[2] {"Doberkat", "Dißmann"};
Date rueckgabeTermin = new Date();
...
}
public void methode () {
int dez, hex;
String[] autoren;
Date rueckgabeTermin;
...
}
Java-Einführungskurs
28
29
Lehrstuhl für Angewandte Telematik/e-Business
Java-Einführungskurs
30
5
23.03.2004
Konstanten: Primitive Typen
Konstanten: Referenztypen
• Modifikator final bewirkt, dass der Wert von Variablen,
Parametern, Attributen nach der Initialisierung fixiert ist
• Modifikator final bewirkt nur, dass in Variablen,
Parametern, Attributen gespeicherte Referenzen fixiert sind
¾ Attribute der referenzierten Objekte können weiterhin
geändert werden!
public class Klasse {
private final int ANTWORT_AUF_ALLES = 42;
public void methode () {
final Klasse objekt = new Klasse(); // Referenz fixiert
...
objekt.x = 5; // Werte des ref. Objekts noch änderbar
...
objekt = null; // Fehler: Referenz nicht mehr änderbar
...
}
}
public void methode (final String param) {
final int zahl; // Initialisierung nicht sofort nötig
...
zahl = 21;
// einmalige Zuweisung möglich
...
zahl = 12;
// Fehler: nur Initialisierung erlaubt
param = "Test"; // Fehler: Wert nach Übergabe fixiert
}
}
Java-Einführungskurs
31
Java-Einführungskurs
Blöcke und Sichtbarkeit (Scope
(Scope))
Überdecken von Attributen
• Java-Code ist in verschachtelten Blöcken strukturiert,
die durch { } begrenzt werden
• Variablen gelten nur in dem Block, in dem sie deklariert sind
• Variablen können nicht in "Unterblöcken" deklariert werden,
wenn sie bereits in "Oberblöcken" deklariert wurden
• Deklaration von Variablen mit bereits verwendeten
Attributnamen führt zur Überdeckung der Attribute
• sowohl Variablen als auch Attribute bleiben zugänglich
public void methode (int param) {
int param = 1;
// Fehler:
int zahl = 2;
// zahl ab
if (...) {
int zahl = 3;
// Fehler:
zeichen = 'A';
// Fehler:
char zeichen = 'B'; // zeichen
}
zeichen = 'C';
// Fehler:
if (...) {
char zeichen = 'D'; // zeichen
}
}
param schon deklariert
hier sichtbar
zahl bereits deklariert
zeichen nicht deklariert
erst ab hier sichtbar
zeichen nicht mehr dekl.
wieder deklarierbar
Java-Einführungskurs
33
• Variablen über ihren Bezeichner, Attribute über this.Bezeichner
• this ist Referenz auf Objekt, zu dem die Methode gehört
public class Buch () {
private String autoren;
...
public void setAutoren (String autoren) {
this.autoren = autoren; // Attribut = Parameter
}
public String getAutoren () {
return autoren; // Attribut zurückgeben
}
}
Java-Einführungskurs
Überdecken, Überladen, Überschreiben
Variablenarten
• Überdecken eines Attributs
• lokale Variablen
• Deklaration einer Methodenvariable mit gleichem Namen
wie Attribut des Objekts
• Zugriff auf Methodenvariable über den Namen
• Zugriff auf überdecktes Attribut über this-Referenz und Name
34
• in einer Methode (oder in einem Block einer Methode) deklariert
• gültig von Deklaration bis Ende des Blocks/der Methode
• Parameter
• im Kopf einer Methode oder eines Konstrukturs deklariert
• gültig in gesamter Methode/gesamtem Konstruktor
• Überladen einer Methode
• Deklaration von Methoden mit gleichen Namen,
aber unterschiedlichen Signaturen
• Zugriff auf verschiedene Methoden anhand übergebener Parameter
• Überschreiben einer Methode
• Deklaration einer Methode mit gleichem Namen
wie Methode der Oberklasse
• Zugriff auf Methode der Unterklasse über den Namen
• Zugriff auf Methode der Oberklasse über super-Referenz und Name
Java-Einführungskurs
32
35
Lehrstuhl für Angewandte Telematik/e-Business
• Attribute (Instanzvariablen)
• in einer Klasse deklariert
• in individuellen Objekten gültig von Instanziierung bis Zerstörung
• Klassenvariablen
• in einer Klasse mit Modifikator static deklariert
• nicht an Instanzen der Klasse gebunden, sondern im gesamten
Programm gültig
Java-Einführungskurs
36
6
23.03.2004
Klassenvariablen
Klassenmethoden
• nicht an Instanzen der Klasse gebunden, sondern im
gesamten Programm gültig
• mit Schlüsselwort static deklarierte Methoden
• dürfen ausschließlich auf Klassenvariablen und andere
Klassenmethoden zugreifen, nicht auf "normale" Attribute und
Methoden!
• mit Schlüsselwort static deklarierte Attribute
public class Statistik {
public static float durchschnitt (...);
}
public class Klasse {
public static int variable;
public static final String konstante = "Konstante";
...
}
• Zugriff über den Klassennamen ohne vorherige
Instanziierung eines Objekts
• Zugriff über den Klassennamen ohne vorherige
Instanziierung eines Objekts
float avg = Statistik.durchschnitt (...);
• public static void main() ist Klassenmethode
Klasse.variable = 42;
System.out.println (Klasse.konstante);
Java-Einführungskurs
• zu Programmbeginn können noch keine Objekte instanziiert sein
37
Java-Einführungskurs
mainmain-Klassenmethode in BlueJ
Zusammenfassung
• nicht über ein Objekt aufrufbar, sondern nur über die Klasse
• Sichtbarkeitsmodifikatoren
38
• public, ohne (Paket), private, protected
• Primitive Datentypen und ihre Literale
• boolean; short, byte, int, long; float, double; char
• Referenzdatentypen
• Referenzen auf Objekte, Garbage Collection
• Object, String, Arrays
• Methodendeklaration und Methodensignatur
• Parameterübergabe per Wert und per Referenz
• Überladen von Methoden und Konstruktoren
• Deklaration von Variablen und Konstanten
• Überdecken von Attributen
• Blöcke und Sichtbarkeit
• Klassenvariablen und –methoden (static)
Java-Einführungskurs
39
Java-Einführungskurs
40
Und täglich grüßt das Murmeltier...
• ...morgen um 9:15 Uhr s.t. im Hörsaal 1, Talstraße 35!
Java-Einführungskurs
41
Lehrstuhl für Angewandte Telematik/e-Business
7