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