Paket - Proteus

Werbung
CS1005
Objektorientierte Programmierung
Bachelor of Science (Informatik)
Th Letschert
Programmorganisation / Sichtbarkeiten
Einfache Ein- / Ausgabe
Seite 1
© Th Letschert
Sichtbarkeiten
Sichtbarkeiten
Seite 2
Th Letschert
Sichtbarkeit
Sichtbarkeit / Gültigkeit
zu einem Namen gehört immer eine
bestimmte zuständige Definition
Die zuständige Definition ist immer die
textuell nächste Definition
Definitionen können durch andere mit
dem gleichem Namen „abgedeckt“
werden.
Sichtbarkeitsbereich
(Gültigkeitsbereich, engl. Scope)
Bereich in dem ein Name gültig sind.
In einer großen Anwendung gibt es hunderte
oder tausende von Definitionen auf die man
mit jeweils einem Namen Bezug nehmen
kann.
Die gute Organisation der Namen ist wichtig.
Sichtbarkeits-Bereich 1: Klasse C
Sichtbarkeits-Bereich 2: Konstruktor 1
(Innerhalb von 1)
public class C {
private int b;
public C() {
b = 0;
}
public C(int b) {
this.b = b;
}
Sichtbarkeits-Bereich 3: Konstruktor 2
}
(Innerhalb von 1)
Der Parameter b deckt im Bereich des 2-ten
Konstruktors die Objekt-Variable b ab.
Seite 3
Th Letschert
Sichtbarkeit
Statisches Scoping in Java
Der Programmtext definiert die Zuordnung Name~>Definition
nicht die Ausführung des Programmcodes.
Sichtbarkeitsbereiche in Java
Block / For-Anweisung
Ein Block ist eine Anweisungsfolge in geschweiften Klammern
For-Anweisungen können in ihrem Kopf Variablen definieren
Namen, die in Blocks / For-Anweisungen eingeführt werden, dürfen Namen
der umfassenden Methode nicht abdecken.
Methode
Lokale Definitionen dürfen Parameter nicht abdecken
Alle anderen Namen dürfen abgedeckt werden
Klasse
Alle umfassenden Namen dürfen abgedeckt werden
Paket
Die Sichtbarkeitsstruktur von Paketen ist flach
Ineinander geschachtelte Pakete definieren keine ineinander
geschachtelten Sichtbarkeitsbereiche
Seite 4
Th Letschert
Sichtbarkeit: Klassensichtbarkeit
Sichtbarkeitsdeklaration innerhalb von Klassendefinitionen
public
öffentlich: benutzbar aus allen anderen Klassen
keine
paketlokal: benutzbar von allen Klassen dieses Pakets
private
privat: benutzbar nur aus dieser Klasse
(protected: in abgeleiteten Klassen und im gleichen Paket)
Die Sichtbarkeit regelt die Beziehungen von Klassen nicht die von Objekten !
public class C {
private int a;
int b;
public int c;
}
// Zugriff
// nur durch Methoden dieser Klasse
// nur durch Meth. v. Klassen im gleichen Paket
// durch alle Methoden aller Klassen
Seite 5
Th Letschert
Sichtbarkeit: Klassensichtbarkeit
Klassensichtbarkeit:
Zugriff auf Definitionen innerhalb von Klassen
Klassensichtbarkeit
regelt die Sichtbarkeit der
Bestandteile einer Klasse
private
default
public
class A
class C
package b
erlaubte Zugriffe auf Methoden
und Variablen
class B
package a
Zugriff auf Methoden in Klassen in anderen Paketen:
nur wenn public
Zugriff auf Methoden in Klassen im gleichen Paket
nur wenn nicht private
Zugriff auf Methoden der gleichen Klasse
immer
Seite 6
Th Letschert
Sichtbarkeit: Paketsichtbarkeit
Paketsichtbarkeit:
Sichtbarkeitsdeklaration innerhalb von Paketen (z.B. vor Klassen)
public
öffentlich: benutzbar aus allen anderen Paketen
keine
paketlokal: benutzbar innerhalb dieses Pakets
package p;
public class C { // Zugriff auf diese Klassendef. aus jedem Paket
.....
}
package p;
class D {
// Zugriff auf diese Klassendef. nur im Paket p
.....
}
Programm mit 2 Klassen
in einem Paket
Seite 7
Th Letschert
Sichtbarkeit: Paketsichtbarkeit
Paketsichtbarkeit:
Zugriff auf Definitionen innerhalb von Paketen
Paketsichtbarkeit
Regelt die Sichtbarkeit von
Bestandteilen eines Pakets
default
class A
class D
package b
public
class B
default
class C
erlaubte Zugriffe auf Klassen
Zugriff auf Definitionen in anderen Paketen:
nur wenn public
Zugriff auf Definitionen im gleichen Paket:
immer
package a
Seite 8
Th Letschert
Sichtbarkeit
Zugriff auf eine Definition in einer
anderen Klasse
Paketsichtbarkeit
Definition
(Meth./Varia.)
Paket-Sichtbarkeit der Klasse OK
&& Klassen-Sichtbarkeit der Definition
OK
Klasse
Paket
Klassensichtbarkeit
Klassenextern: Sichbarkeitsattribute
regelt Sichtbarkeit
Zugriff auf eine Definition in der
gleichen Klasse
Definition im gleichen Scope
|| Definition im umfassenden Scope
&& nicht abgedeckt
Klassenintern: Verschachtelung
regelt Sichtbarkeit
Seite 9
Th Letschert
Sichtbarkeiten
Paket-Sichtbarkeit
Die Paket-Verschachtelung hat
keinen Einfluss auf Sichtbarkeit !
Code in
anderem Paket
public
anderes Paket
Paket
definiert Schnittstelle
eines Pakets zu anderen
Paketen
default
Schnittstelle zu
anderen Paketen
Klassen-Sichtbarkeit
definiert Schnittstelle
einer Klasse zu
anderen Klassen
Code in
anderem Paket
anderes Paket
Abgestufte Sichtbarkeit:
Sichtbarkeit hängt vom
Gesehen und vom Seher ab.
public
default
Code in
anderer Klasse
private
andere Klasse
Klasse
Paket
Seite 10
Schnittstelle zu anderen
Klassen
(in anderen Paketen)
Schnittstelle zu anderen
Klassen
im gleichen Paket
Th Letschert
Pakete
Codeorganisation:
Pakete und
Verzeichnisse
Seite 11
Th Letschert
Pakete
Pakete (packages)
Strukturierungsmittel für:
Typ-Definitionen
und
Sub-Pakete
Pakete sind: Kollektionen von Typdefinitionen (Klassendef.)
und anderen (Sub-) Paketen
Pakete sind Namenräume
Namen aus einem anderen Paket müssen
qualifiziert
package diesesPaket; // hier in Paket diesesPaket
anderesPaket.C c = new anderesPaket.C();
....
anderesPaket.subPaket.D d = ....
oder
importiert werden
import anderesPaket.C; // einer oder
import anderesPaket.*; // alle
import anderesPaket.subPaket.*;
C c = new C();
Seite 12
Th Letschert
Pakete: Paketzugehörigkeit / Importe
Die folgende Definition
gehört zum Paket rational.
package rational;
import static rational.Sign.*;
import irrational.*;
class Rational {
private int num;
private int deNum;
private Sign sign;
Alle Namen aus
rational.Sign und
irrational können frei
benutzt werden
Die Klasse Rational kann
nur im Paket rational
benutzt werden.
public Rational(){
num
= 0;
deNum = 1;
sign = plus;
}
...
Diese Methode darf in allen
anderen Klassen benutzt
werden (natürlich nur in
denen, die auf die Klasse
Rational selbst Zugriff
haben).
}
Konvention: Klassen-Namen groß, Paket-Namen klein!
Definitionen immer in Pakete platzieren!
Seite 13
Th Letschert
Pakete / Importe
Importe
Verwendung von Namen anderer Pakete
Namen aus anderen Paketen können nur voll qualifiziert oder nach einer
Import-Anweisung verwendet werden
Import-Anweisung (Single Type Import Declaration)
import p1.p2.p3.Name;
führt Kurzversion eines Namens ein:
Name kann verwendet werden statt p1.p2.p3.Name
in der Übersetzungseinheit (Klasse), die der Import-Anweisung sich befindet
Import bei Bedarf (Import on Demand Declaration)
import p1.p2.p3.*;
führt alle öffentlichen Namen des Pakets p1.p2.p3 ein: sie können in ihrer
Kurzform (ohne Paket-Name) verwendet werden.
Automatische Importe
alle Namen des Pakets java.lang werden automatisch importiert, so als ob
import java.lang.*;
am Anfang jeder Übersetzungseinheit stehen würde
Seite 14
Th Letschert
Pakete / statische Importe
statischer Import
import static p1.p2.p3.Name.StatischeKomp;
import static p1.p2.p3.Name.*;
importiert alle statischen Mitglieder von Name :
StatischeKomp kann verwendet werden statt p1.p2.p3.Name.StatischeKomp
ohne statischen Import:
import p1.p2.p3.Name;
.....
..... Name.StatischeKomp .....
mit statischem Import:
import static p1.p2.p3.Name.*;
.....
..... StatischeKomp .....
package oopBasics;
public class Algorithms {
public static int ggt(int x, int y) {
...
}
....
}
package otherPackage;
import static oopBasics.Algorithms.*;
public class User {
public static void main(String[] args) {
System.out.println( ggt (2,4) );
}
}
Seite 15
Th Letschert
Pakete: statischer Import von Enums
package rational;
package rational;
public enum Sign {
plus, minus
}
import static rational.Sign.*;
class Rational {
private int num;
private int deNum;
private Sign sign;
Enum-Definition
package anderesPaket;
import static rational.Sign.*;
import rational.Sign;
public class Rational {
private int num;
private int deNum;
}
public Rational(){
num
= 0;
deNum = 1;
sign = plus;
}
...
private Sign sign;
}
public Rational() {
num = 0;
deNum = 1;
sign = plus;
}
...
Nutzer der Enum-Definition
im gleichen Paket
Nutzer der Enum-Definition
in einem anderen Paket
Seite 16
Th Letschert
Pakete, Dateien, Verzeichnisse
Java-Code hat eine festgelegte Datei- /
Verzeichnis-Struktur
Übersetzungseinheit ~ Datei
vollständige Quelltexte, die der
Compiler akzeptiert (Definitionen),
müssen in einer Datei mit gleichem
Namen stehen
(z.B. Klassendefinition dürfen nicht auf
2 Dateien verteilt werden)
eine Datei darf nur eine öffentliche
Klassendefinition enthalten und sollte
nur eine Klassendefinition enthalten
Paket ~ Verzeichnis
Definitionen die zu einem Paket
gehören sind in einem Verzeichnis das
den Paket-Namen trägt
package p.q;
class C {
....
}
Übersetzungseinheit
Verzeichnis p
Unterverzeichnis q
Paket-Struktur ~ Verzeichnisstruktur
Unterpakete sind in
Unterverzeichnissen
Datei C.java
Seite 17
Th Letschert
Pakete, Dateien, Verzeichnisse
Verzeichnis p
Quelltexte und übersetzter Code
(Klassen-Dateien)
Quellcode in java-Dateien wird in
Bytecode in .class-Dateien übersetzt.
Unterverzeichnis q
Die Organisation der class-Dateien in
Verzeichnissen muss ebenfalls der
Paket-Struktur entsprechen.
C.java
C.class
Ein Verzeichnisbaum
Die class-Dateien können
in der gleichen oder
in einer anderen
Verzeichnisstruktur abgelegt werden.
source
classes
Verz. p
Verz. p
Unterverz. q
Unterverz. q
C.class
C.java
Zwei Verzeichnisbäume
Seite 18
Th Letschert
Pakete, Dateien, Verzeichnisse
Java-Tools verlassen sich auf die festgelegte Datei- / VerzeichnisStruktur
Der Compiler (javac) verlässt sich auf die Einhaltung der Regeln.
Die virtuelle Maschine (java) verlässt sich auf die Einhaltung der Regeln
Die Struktur der package-Deklarationen muss mit der Verzeichnisstruktur
übereinstimmen.
cd source
javac p/q/C.java
source
cd source
java p.q.C
p
cd myProject/source
javac -d ../class
p/q/C.java
myProject
source
class
p
p
cd myProject/class
java p.q.C
q
q
C.java
q
C.class
javac
C.java
Seite 19
javac
C.class
Th Letschert
Pakete, Dateien, Verzeichnisse / Klassenpfad
Klassenpfad
Die virtuelle Maschine (java) sucht Bytecode (class-Dateien) in definierten
Verzeichnissen.
Default-Verzeichnis: aktuelles Verzeichnis
java AClass aktiviert Aclass.main, weitere Definitionen werden in der
Verzeichnisstruktur gesucht, die das aktuelle Verzeichnis als Wurzel hat
(z.B. das Pojekt- oder das classes-Verzeichnis)
Klassenpfad-Option
java -classpath /my/java/project AClass aktiviert
Aclass.main, weitere Definitionen werden in der Verzeichnisstruktur gesucht,
die /my/java/project als Wurzel hat.
Der Klassenpfad kann mehrere Einträge enthalten
java -classpath /path1;/path2 AClass aktiviert Aclass.main,
weitere Definitionen werden in der Verzeichnisstruktur gesucht, die /path1
oder/path1 als Wurzel hat. (Verzeichnisse durch Semikolon trennen)
Der Klassenpfad kann als Umgebungs-Variable des BS gesetzt werden
Seite 20
Th Letschert
Einfache
Eingabe und Ausgabe
Seite 21
Eingabe und Ausgabe
Ein und Ausgabe
Konsolen-I/O
GUI-I/O
vordefinierte Dialoge-Klassen
eigene GUI-Klassen
Seite 22
Eingabe und Ausgabe: Konsole
java.lang Class System
Konsolen
statische Variablen der Klasse System die mit
externen (Betriebssystem-) Mechanismen zur
Text-I/O auf einer Konsole (Terminal)
verbunden sind
Eingabe-Konsole
➔
System.in
Standard-Eingabe via Tastatur
Ausgabe-Konsole
➔
System.out
Standard-Ausgabe auf ein „Terminal“
➔
Sytem.error
Fehler-Ausgabe auf ein „Terminal“
Seite 23
static PrintStream
static InputStream
static PrintStream
err
in
out
Eingabe und Ausgabe: Konsole
Konsolen-Ausgabe:
System. out .print(“Polynomwert an der Stelle “ + x );
System. out .println(“ = “ + p.value(x) );
System. err .println(“ Fehler ! “);
Seite 24
Eingabe und Ausgabe: Scanner-Klasse
Konsolen-Eingabe via Scanner-Klasse:
import java.util.Scanner;
java.util Class Scanner
String
double
int
...
next()
nextDouble()
nextInt()
public class Hallo {
public static void main(String[] args) {
Baer bruno = new Baer(“Bruno“);
EingabeMedium
Scanner scan = new Scanner(System. in );
int x = scan.nextInt();
bruno.sagHallo(x);
System.out.print(“Jetzt hat er “+x);
System.out.println(“ mal gebrummt “);
}
}
Seite 25
Erkennen
(Scannen)
Eingabe und Ausgabe: Elementar
Konsolen-Eingabe „zu Fuß“:
public static void main(String[] args) throws IOException {
InputStreamReader streamReader
= new InputStreamReader(System.in);
BufferedReader bufferedReader
= new BufferedReader(streamReader);
String line = bufferedReader.readLine();
line.trim();
String[] tokens = line.split("\\s");
double[] values = new double[tokens.length];
int i = 0;
for ( String s : tokens )
values[i++] = Double.parseDouble(s);
}
Polynom p = new Polynom(values);
System.out.println(p.value(3.0));
Seite 26
Zeile lesen
Zeile „trimmen“
Zeile zerlegen
\s ~ weiße Zeichen
Strings zu DoubleWerten
Eingabe und Ausgabe: Dialoge mit JOptionPane
javax.swing Class JOptionPane
JOptionPane
Klasse mit statischen Methoden zur einfachen Erzeugung
von Dialogen
javax.swing.JOptionPane
Klasse
JoptionPane.show XXX Dialog
statische
Methoden
Modale Dialoge: Anwendung wartet bis Eingabe vorliegt
Dialoge:
showConfirmDialog
showInputDialog
showMessageDialog
showOptionDialog
Ja- / Nein-Entscheidungen
Eingabe-Wert anfordern
Nachricht zeigen
Auswahl treffen lassen
Seite 27
Eingabe und Ausgabe: Dialog-Beispiel
import javax.swing.JOptionPane;
public class JOptionDemo {
public static void main(String[] args) {
String inputStr1; //Eingabe-String 1
int
inputInt1; //Eingabe-Wert
1
öffnet Eingabefenster
String inputStr2; //Eingabe-String 2
int
inputInt2; //Eingabe-Wert
2
//Eingabe-Dialog 1:
inputStr1 = JOptionPane.showInputDialog("Enter input 1:");
inputInt1 = Integer.parseInt(inputStr1);
//Eingabe-Dialog 2:
inputStr2 = JOptionPane.showInputDialog("Enter input 2:");
inputInt2 = Integer.parseInt(inputStr2);
//Ausgabe-Fenster:
öffnet Ausgabefenster
JOptionPane.showMessageDialog( null,
" " + inputInt1 + " + "
+ inputInt2 + " = "
+ inputInt1 + inputInt2 );
System.exit(0); //Programmende
}
}
Seite 28
Eingabe und Ausgabe: Dialoge
Eingabe über Dialogfenster:
String-Variable =
JOptionPane.showInputDialog( String-Ausdruck )
Öffnet ein Fenster mit der Nachricht String-Ausdruck in das der Benutzer
einen String eingeben kann, der dann in der String-Variable gespeichert
wird.
Ausgabe über Dialogfenster:
JOptionPane.showMessageDialog(null, String-Ausdruck )
Öffnet ein Fenster mit der Nachricht String-Ausdruck .
Seite 29
Eingabe und Ausgabe: Dialoge, weitere Beispiele
String options[] = {"Rosa", "Blau", "Gelb"};
String farbe = (String) JOptionPane.showInputDialog(null,
"Welches Schweinchen soll es sein?",//
"Schweinchen Wahl",
//
JoptionPane.QUESTION_MESSAGE,
//
null, options, options[0]);
//
if ( farbe.equals("Gelb") )
JOptionPane.showMessageDialog( null, "Gelb?",
"SchweinchenError",
JOptionPane.ERROR_MESSAGE);
else if ( farbe.equals("Blau") )
JoptionPane.showMessageDialog( null,
"Blau?",
"SchweinchenWarnung",
JOptionPane.WARNING_MESSAGE);
else if ( farbe.equals("Rosa") )
JOptionPane.showMessageDialog( null, "Rosa-Prima!",
"SchweinchenInfo",
JOptionPane.INFORMATION_MESSAGE);
Seite 30
Text
Titel
Art
Wahl
Eingabe und Ausgabe: Confirm-Dialog
Ja- / Nein-Entscheidungen:
int-Variable =
JoptionPane.showConfirmDialog(null,
messageString,
titleString,
JOptionPane.Yes_NO_OPTION)
zeigt eine Dialog-Fenster für Ja/Nein-Entscheidungen
liefert Entscheidungswert in der int-Variable
Beispiel:
int dec = JOptionPane.showConfirmDialog(null,
"Stop?",
"StopDialog",
JOptionPane.YES_NO_OPTION);
if ( dec == JOptionPane.YES_OPTION )
break;
Seite 31
Eingabe und Ausgabe: Beispiel Confirm-Dialog
...
while ( true ) {
inputStr = JOptionPane.showInputDialog("Eingabe:");
try {
v = Integer.parseInt(inputStr);
JOptionPane.showMessageDialog(null,
"fak("+v+")= "+ fak(v) );
int dec = JOptionPane.showConfirmDialog(null,
"Stop?", "StopDialog", JOptionPane.YES_NO_OPTION);
if ( dec == JOptionPane.YES_OPTION )
break;
} catch (NumberFormatException e){
JOptionPane.showMessageDialog( null,
"Fehlerhafte Eingabe!" );
} catch (ArithmeticException e){
JOptionPane.showMessageDialog( null,
"negativ kann ich nicht" );
}
}
....
Seite 32
Eingabe und Ausgabe: Options-Dialog
String[] options = {"Rot", "Gelb", "Gruen", "Blau", "Schwarz"};
int n = JOptionPane.showOptionDialog(null,
"Welche Farbe haetten Sie gerne", //Text
"Farbwahl",
//Titel
JOptionPane.YES_NO_CANCEL_OPTION,
JOptionPane.QUESTION_MESSAGE,
null,
options,
options[2]);
//Vorauswahl
liefert in n die Nummer der gewählten Option (Alternative)
Seite 33
Eingabe und Ausgabe: Datei auswählen
Auswahl einer Datei :
javax.swing Class JFileChooser
JFileChooser fc = new JFileChooser();
returnVal =
fc.showDialog(null, “Waehle Datei“);
if (returnVal == JfileChooser.APPROVE_OPTION ) {
File f = fc.getSelectedFile();
...
}
Seite 34
Eingabe und Ausgabe: Datei auswählen
Auswahl einer Datei Beispiel:
private static File waehleDatei(String msg) {
JFileChooser fc = new JFileChooser();
int returnVal = fc.showDialog(null, msg);
if (returnVal == JFileChooser.APPROVE_OPTION) {
return fc.getSelectedFile();
} else
return null;
}
public static void main(String[] args) throws FileNotFoundException {
File file = waehleDatei("Eingabedatei");
if ( file == null ) System.exit(0);
Scanner scan = new Scanner(file);
while ( scan.hasNext() ) {
String s = scan.next();
.... s verarbeiten ...
}
}
Seite 35
Herunterladen