252-0027
Einführung in die Programmierung 4.0 Klassen und Objekte
Thomas R. Gross
Department Informatik ETH Zürich
1
4.0 Klassen und Objekte
§ 4.4 Attribute
§ 4.5 Methoden
§ 4.6 Konstruktoren
§ 4.7 Sichtbarkeit von Attributen
§ 4.8 static Methoden und Variablen
2
4.7 Sichtbarkeit für Attribute
61
Attribute für Person
public class Person { String name;
int id;
double hourlyRate;
double[] hours;
double[] overtime;
// various methods
… }
§ Wenn wir für jede Person den Stundenlohn festhalten
wollen können wir ein Attribut hinzufügen
62Zugriff auf Attribute
§ Jeder Klient kann (bisher) auf alle Attribute eines Objektes zugreifen (lesen und/oder modifizieren)
§ Accessor und Mutator Methoden strukturieren den Code aber Zugriff ist noch immer möglich
§ Dies ist nicht immer gewünscht
§ Sonst könnte jeder hourlyRate verändern … public void myFriend(Person p) {
p.hourlyRate = p.hourlyRate * 2.0;
}
63
Zugriff auf Attribute
§ Jeder Klient kann (bisher) auf alle Attribute eines Objektes zugreifen (lesen und/oder modifizieren)
§ Wie können wir Objektexemplare so konstruieren dass (manche/alle) Attribute "geschützt" sind?
§ Grundproblem der Abkapselung ("Encapsulation")
64
"Encapsulation" (Datenkapselung)
§ Bisher: Definition von Variablen in Methoden
§ … und in Blöcken innerhalb von Methoden
§ Regel: keine Doppeldefinitionen
§ Jetzt: Objekte haben einen Zustand (Objektattribute)
§ Variable ausserhalb von Methoden deklariert
§ Zugriff (Dot-Notation) mittels Referenzvariable
§ Klassen als Mechanismus der Abkapselung
§ "Encapsulation" (manchmal Datenkapselung)
67
Point int x;
int y;
public class Point { int x;
int y;
}
Pointint x;
int y;
Point int x;
int y;
Encapsulation
§ Idee: Verstecken der Details der Implementation einer Klasse vor den Klienten der Klasse
§ Encapsulation zwingt zur Abstraktion.
§ Trennung von Verhalten (extern sichtbar) und Zustand (intern)
§ Schützt die Daten eines Objektes vor unbeabsichtigten oder unerwünschten Operationen
§ Encapsulation erlaubt Anpassung(en) der Implementation ohne
Änderungen der Klienten Programme
Abstraktion und Datenkapselung
§ iPod Verhalten festgelegt durch (zugängliche) Schalter/Regler sowie Steuerfunktionen
§ Hersteller (des iPods) kann Implementation ändern (schnellerer Prozessor, mehr Speicher)
§ … und der Hersteller (der Boards) kann andere Speicherchips einsetzen
69
Encapsulation
§ Bei der Definition eines Attributes können wir dessen Sichtbarkeit angeben
§ Attribute die nur intern (d.h. von Methoden der Klasse) geändert bzw gelesen werden können
§ Attribute auf die "von aussen" (d.h. aus Methoden anderer Klassen – d.h. extern) zugegriffen werden kann
§ Zugriff mit Dot Notation
§ Bisher in unseren Klassen verwendet um nicht zuviel auf einmal erklären zu müssen
§ Später lernen wir noch andere Möglichkeiten kennen, interne und externe Attribute zu trennen
70
Private Attribute
Ein Attribut ("field") auf das nicht von ausserhalb der Klasse zugegriffen werden kann
§ Syntax:
private type name ;
§ Beispiele (alles Attribute einer Klasse!)
private int id;
private String name;
Private Attribute
public class Person {
private String name;
private int id;
private double hourlyRate;
private double[] hours;
private double[] overtime;
// various methods
public double computePay() { ...
for (int i = 0; i < hours.length; i++) ...
}
} § Direkter Zugriff auf Attribute in Methoden der Klasse
72Person Objekte mit Methode computePay
public class Person { private String name;
private int id;
private double hourlyRate;
private double[] hours;
private double[] overtime;
// Computes wages, 25% overtime supplement public double computePay() {
double sumStd = 0;
double sumOvt = 0;
for (int i = 0; i < hours.length; i++) { sumStd += hours[i];
}
for (int i = 0; i < overtime.length; i++) { sumOvt += overtime[i];
}
return sumStd * hourlyRate + sumOvt * hourlyRate * 1.25;
}
} 73
Private Attribute
// irgendwo in einem Klienten
Person myRecord = …; // set to my Person object
myRecord.hourlyRate = 50;
§ Klienten Programm wird nicht übersetzt wegen unerlaubten Zugriffs auf privates Attribut:
PersonExample.java:17: hourlyRate has private access in Person
myRecord.hourlyRate = 50;
74public class Person { ...
private double hourlyRate;
...
// various methods
}
Zugriff auf private Attribute
§ Nur Methoden die in der Klasse definiert sind können auf private Attribute zugreifen
§ Siehe Methode computePay
§ Wenn Zugriff von extern erlaubt sein soll dann muss die Klasse dafür Methoden zur Verfügung stellen
§ Accessor Methode(n)
§ Mutator Methode(n)
75
Zugriff auf den privaten Zustand
// A "read-only" access to the hourlyRate field // ("accessor")
public int getHourlyRate() { return hourlyRate;
}
// Allows clients to change the hourlyRate field // ("mutator")
public void setHourlyRate (int newRate) { hourlyRate = newRate;
}
Zugriff auf den privaten Zustand, im Klienten
§ Das Klientenprogramm sieht dann so aus :
System.out.println(myRecord.getHourlyRate());
myRecord.setHourlyRate(40);
77
Vorteile Mutator/Accessor Methode
§ Methoden können zusätzliche Kontrollen vornehmen
§ Check Recht eine Änderung vorzunehmen
§ Log aller Änderungen
§ Methoden können Transformationen vornehmen
78
Point class
// A Point object represents an (x, y) location.
public class Point { private int x;
private int y;
public Point(int initialX, int initialY) { x = initialX;
y = initialY;
}
public int getX() { return x;
}
public int getY() { return y;
}public void setX (int newX){
x = newX;
}public void setY (int newY) { ...
public double distanceFromOrigin() { return Math.sqrt(x * x + y * y);
}
public void setLocation(int newX, int newY) { setX(newX);
setY(newY);
}
public void translate(int dx, int dy) { setLocation(x + dx, y + dy);
} }
Vorteile der Encapsulation
§ Abstraktion des Objektes und des Klienten
§ Objekt: stellt Methoden zur Verfügung, "verheimlicht"
Implementation
§ Klient: ruft Methoden auf, keine Annahmen über die Implementation
§ Schutz vor unerwünschtem Zugriff
§ Accessor/Mutator Methoden sind optional
§ Beispiel: Person ohne setHourlyRate Methode
§ Objekt kann (z.B.) ein Protokoll der Zugriffe anlegen
§ Wann wurde hourlyRate geändert
§ Objekt kann weitere Kontrollen durchführen (Erlaubnis …)
80
Vorteile der Encapsulation
§ Objekt kann die Implementation verändern
§ Beispiel: Klasse Point könnte Polarkoordinaten (r, θ) verwenden – Namen der Methoden sind gleich aber die
Implementation ändert sich
§ Beispiel: Klasse Person unterscheidet zwischen Normalzeit, Überzeit und Überstunden
§ Können den Zustand eines Objektes weiteren Beschränkungen unterwerfen
§ Beispiel: hourlyRate muss positiv sein
§ Ein Datum muss einen Monat von 1 bis 12 enthalten etc
81Encapsulation (Hinweis)
§ Nicht nur Attribute können private sein, auch Methoden
§ Nicht-öffentliches Verhalten
§ Sinnvoll wenn wir aus Methoden gemeinsame Anweisungen herausnehmen wollen (und in einer eigenen Methode
zusammenfassen) aber sicher stellen wollen, dass diese Methode nicht von einem Klienten direkt aufgerufen wird
§ Syntax:
private type name ( parameters ) { statements ;
}
82Enkapsulation
§ Bisher: Variable (oder Parameter) in Methode geschützt
§ Deklariert Variable für Block (bzw Parameter für Body der Methode)
§ Kein Zugriff von aussen
§ Jetzt: Attribute deklarieren Variable für die Methoden der Klasse
§ Attribut geschützt wenn sie private sind
§ Verantwortung der Entwickler
§ Was passiert bei Namenskonflikten?
8385
Encapsulation und Namensräume
§ Sie erinnern sich an den Konstruktor für Point Objekte:
public Point(int initialX, int initialY) { x = initialX;
y = initialY;
}
§ Parameter definiert eine Variable für den Rumpf der Methode
§ Regel gilt auch für Konstruktoren
§ Was passiert wenn wir x und y als Namen für die Parameter verwenden (wollen)?
86
88
90
Encapsulation und Namensräume
§ Konstruktor für Point Objekte:
public Point(int x, int y) { this.x = x;
this.y = y;
}
§ Der Parameter verdeckt (shadows) das Attribut der Klasse Point
§ Müssen daher mittels this auf das x-Attribut bzw y-Attribut der Klasse zugreifen
91
this
§ this verweist also auf den impliziten Parameter einer Methode
§ this kann auch verwendet werden um einen anderen Konstruktor aufzurufen (später mehr)
§ Ein Konstruktor ruft einen anderen auf:
this(parameters);
§ Klammern ( und ) wichtig
§ Beispiel für sinnvollen Einsatz später
93
Verdecken von Variablen ("shadowing")
§ shadowing: Zwei Variable mit dem selben Namen die beide sichtbar sind.
§ Normalerweise in Java illegal – Ausnahme wenn eine der Variablen ein Attribut ("field") einer Klasse ist.
§ x und y beziehen sich auf die Attribute
§ Wenn eine Methode x und y als Parameter hat, dann beziehen sich x und y auf die Parameter.
§ Wenn eine Methode x und y als Variable deklariert dann beziehen
sich x und y auf die Variable
Verdecken von Variablen ("shadowing")
public class Point { private int x;
private int y;
void method1() {
// x bezieht sich auf Attribut x }
void method2(int x) {
// x bezieht sich auf Parameter x }
void method3() { int x;
// x bezieht sich auf Variable x }
}
96Verdecken von Variablen ("shadowing")
public class Point { int x;
int y;
void method1() {
// x bezieht sich auf Attribut x }
void method2(int x) {
// x bezieht sich auf Parameter x }
void method3() { int x;
// x bezieht sich auf Variable x }
}
97Shadowing Probleme vermeiden
public class Point { private int x;
private int y;
...
public void setLocation(int x, int y) { this.x = x;
this.y = y;
} }
Innerhalb von setLocation,
§ Um sich auf das Attribut ("field") x zu beziehen: verwende this.x
§ Um sich auf den Parameter x zu beziehen: verwende x
Einen anderen Konstruktor aufrufen
public class Point { private int x;
private int y;
public Point() { x = 0;
y = 0;
public Point(int x, int y) { } this.x = x;
this.y = y;
}
} ...
Einen anderen Konstruktor aufrufen
public class Point { private int x;
private int y;
public Point() {
this(0, 0); // calls (x, y) constructor public Point(int x, int y) { }
this.x = x;
this.y = y;
}
} ...
Einen anderen Konstruktor aufrufen
§ Vermeidet Redundanz zwischen Konstruktoren
§ Nur ein Konstruktor kann einen anderen Konstruktor aufrufen
§ Eine Methode kann nicht einen Konstruktor aufrufen!
103
4.8 static Methoden und Variablen
105
Kurze Geschichte der Methoden
die wir in der Vorlesung kennen gelernt hatten
§ public static void main(String[] args) {… }
§ public static void name () { … }
§ public static void name ( type name ) { … }
§ public static type name ( type name ) { … }
§ public type name ( type name ) { … }
§ private type name ( type name ) { … }
106Was bedeutet static wirklich?
die wir in der Vorlesung kennen gelernt hatten
§ public static void main(String[] args) {… }
§ public static void name () { … }
§ public static void name ( type name ) { … }
§ public static type name ( type name ) { … }
§ public type name ( type name ) { … }
§ private type name ( type name ) { … }
107Vom Programm zum (Software)System
§ Fast alle Software Systeme bestehen aus vielen Klassen.
§ Eine Hauptklasse ruft Methoden anderer Klassen auf
§ Hauptklasse hat eine Anfangsmethode
public static void main (String[] args)
)
Main Class #1 mainmethod1 method2
Class #2 method3
method5
Class #3 method4
method6
§ Vorteile:
§ Code Wiederverwendung
§ Gliedert das Programm in überschaubare Teile
108
Ein Programm mit Redundanz, Aufgabe 1
// This program sees whether some interesting numbers are prime.
public class Primes1 {
public static void main(String[] args) {
int[] nums = {1234517, 859501, 53, 142};
for (int i = 0; i < nums.length; i++) { if (isPrime(nums[i])) {
System.out.println(nums[i] + " is prime");
} }
}
// continued on next slide
109
Ein Programm mit Redundanz, Aufgabe 1, Teil 2
// Returns the number of factors of the given integer.
public static int countFactors(int number) { int count = 0;
for (int i = 1; i <= number; i++) { if (number % i == 0) {
count++;
// i is a factor of the number} }
return count;
}
// Returns true if the given number is prime.
public static boolean isPrime(int number) { return countFactors(number) == 2;
}
}
110Ein Programm mit Redundanz, Aufgabe 2
// This program prints all prime numbers up to a maximum.
public
class Primes2 {
public static void main(String[] args) {
Scanner console = new Scanner(System.in);
System.out.print("Max number? ");
int max = console.nextInt();
for (int i = 2; i <= max; i++) { if (isPrime(i)) {
System.out.print(i + " ");
} }
System.out.println();
}
// continued on next slide
111Ein Programm mit Redundanz, Aufgabe 2, Teil 2
// Returns true if the given number is prime.
public static boolean isPrime(int number) { return countFactors(number) == 2;
}
// Returns the number of factors of the given integer.
public static int countFactors(int number) { int count = 0;
for (int i = 1; i <= number; i++) { if (number % i == 0) {
count
++; // i is a factor of the number} }
return count;
}
}
112Redundanz in Programmen
§ Wir möchten die gemeinsamen Methoden nur einmal schreiben
§ … nur einmal dokumentieren
§ ... nur einmal testen
§ ... (später) nur einmal verändern (falls nötig)
§ Klassen geben uns die Möglichkeit gemeinsames Verhalten (von Objekten) zusammenzufassen.
113
Klassen als Module
§ Modul: wiederverwendbare Software, in einer Klasse abgelegt.
§ Beispiele von Modulen (Klassen): Math, Arrays, System
§ Legen wir die gemeinsamen Methoden in einer Klasse Factors ab
114
Klassen als Module
// This class is a module that contains useful methods // related to factors and prime numbers.
public class Factors {
// Returns the number of factors of the given integer.
public static int countFactors(int number) { int count = 0;
for (int i = 1; i <= number; i++) { if (number % i == 0) {
count++; // i is a factor of the number }
}
return count;
}
115Klassen als Module
// Returns true if the given number is prime.
public static boolean isPrime(int number) { return countFactors(number) == 2;
}
} // Factors
116
Module
§ Ein Modul ist Teil eines Programms, nicht ein vollständiges (ausführbares) Programm.
§ Es gibt keine main Methode. Der Code kann nicht direkt ausgeführt werden..
§ Module sollen von Klienten Programmen (bzw. Klienten Klassen) verwendet werden.
§ Syntax:
class.method(parameters);
§ Beispiel: int factorsOf24 = Factors.countFactors(24);
117static Variable und Methoden
§ static : ist Teil einer Klasse, nicht Teil (Attribut) eines Objektes.
§ Klassen können static Methoden und Variable ("fields") haben.
§ Eine static Variable existiert nur einmal – Methoden aller Exemplare der Klasse können auf diese zugreifen
§ Eine static Variable wird nicht (wie ein Attribut) für jedes Objekt geschaffen.
§ static Variable und Methoden sollten die Ausnahme sein
§ Im "Normalfall" verwenden wir Objektattribute
118
119
class C state:
private static int staticFieldA private static String staticFieldB private int field1;
private double field2;
behavior:
public static void someStaticMethodC() public static void someStaticMethodD() public void method3()
public int method4()
object #1 state:
int field1 double field2 behavior:
public void method3() public int method4()
object #2 state:
int field1 double field2 behavior:
public void method3() public int method4()
object #3 state:
int field1 double field2 behavior:
public void method3() public int method4()
120
class C state:
private static int staticFieldA private static String staticFieldB private int field1;
private double field2;
behavior:
public static void someStaticMethodC() public static void someStaticMethodD() public void method3()
public int method4()
object #1 state:
int field1 double field2 behavior:
public void method3() public int method4()
object #2 state:
int field1 double field2 behavior:
public void method3() public int method4()
object #3 state:
int field1 double field2 behavior:
public void method3() public int method4()
Typ "C" – Exemplare mit Zustand und Verhalten
§ Eine static Methode ist eine Methode für die Klasse
§ Eine static Methode kann ohne eine Referenz auf ein Exemplar aufgerufen werden.
class . method ( parameters );
§ Deshalb haben wir z.B . Arrays.toString(…) oder Math.abs(... ) aufrufen können.
121
Beispiel, Teil 1
// This program sees whether some interesting numbers are prime.
public class Primes {
public static void main(String[] args) {
int[] nums = {1234517, 859501, 53, 142};
for (int i = 0; i < nums.length; i++) { if (Factors.isPrime(nums[i])) {
System.out.println(nums[i] + " is prime");
} }
} }
122
Beispiel, Teil 2
// This program prints all prime numbers up to a given maximum.
public class Primes2 {
public static void main(String[] args) {
Scanner console = new Scanner(System.in);
System.out.print("Max number? ");
int max = console.nextInt();
for (int i = 2; i <= max; i++) { if (Factors.isPrime(i)) {
System.out.print(i + " ");
} }
System.out.println();
} }
123
static Variable
§ static Variable (“field”): Mit der Klasse gespeichert, nicht mit jedem Objektexemplar
§ Alle Methoden einer Klasse können auf eine static Variable zugreifen
§ Gemeinsame ("shared") Variable für alle Exemplare
§ Kann von allen gelesen und modifiziert werden
§ Insbesondere Modifikationen sind kritisch
§ Leicht die Übersicht zu verlieren
§ Vorsicht bei static
124
Module in Java Bibliotheken
// Java's built-in Math class is a module public class Math {
public static final double PI = 3.14159265358979323846;
...
public static int abs(int a) { if (a >= 0) {
return a;
} else {
return -a;
} }
public static double toDegrees(double radians) { return radians * 180 / PI;
}
}
125126
static Variable
private static type name;
private static type name = value;
oder
static type name;
static type name = value;
§ Beispiel:
private static int theAnswer = 42;
128
Zugriff auf static Variable
§ Innerhalb der Klasse in der die Variable deklariert wurde:
fieldName // get the value
fieldName = value; // set the value
§ Aus einer anderen Klasse:
ClassName.fieldName // get the value ClassName.fieldName = value; // set the value
129
Zugriff auf static Variable
§ Im Normalfall sind static Variable private es sei denn sie sind final
§ final: Wert kann nicht geändert warden
§ Damit auf ( static ) Variable in anderen Klassen zugegriffen werden kann müssen diese Variablen public sein
§ Also (in einer Klasse)
public static type name;
public static type name = value ;
§ Keyword public erlaubt überall Zugriff
130Zugriff auf static Variable
§ Aus einer anderen Klasse (wenn die Variable public ist):
ClassName . fieldName // get the value ClassName.fieldName = value; // set the value
§ … doch public static sollte final sein!
131
Übung
§ Erweitern Sie die Klasse Person so, dass jedes neue Objekt eine eindeutige ID für die neue Person erhält
§ Altes Design hatte einen Konstruktor der die ID als Parameter übernahm Person employee1 = new Person("Paula", 123);
Person employee2 = new Person("Erich", 123);
§ Wir wollen jetzt die ID in der Klasse verwalten/zuweisen
132
public class Person { String name;
int id;
double hourlyRate;
double[] hours;
double[] overtime;
// Constructs a Person with given name and Id public Person(String firstname, int uniqueId) {
name = firstname;
id = uniqueId;
}
// Methods ...
}
134
public class Person {
private static int uniqueId = 0;
String name;
int id;
double hourlyRate;
double[] hours;
double[] overtime;
// Constructs a Person with given name and assigns ID public Person(String firstname) {
name = firstname;
id = uniqueId++;
}
// Methods ...
}
135136
static Methoden
// das selbe Format das wir zuerst gesehen haben
public static type name ( parameters ) { statements ;
}
§ static Methode: In der Klasse gespeichert.
§ Gemeinsam für alle Exemplare, nicht für jedes Exemplar kopiert.
§ Es gibt keinen impliziten Parameter this
§ Daher kann eine solche Methode nicht auf den Zustand eines Objekts zugreifen, d.h. (Objekt)Attribute können nicht gelesen oder geschrieben
werden.
138Übung
§ Erweitern Sie die Klasse Person um eine Methode die die Anzahl der bisher erstellten Person Objekte zurückgibt.
139
public class Person {
private static int uniqueId = 0;
String name;
int id;
double hourlyRate;
double[] hours;
double[] overtime;
// Constructs a Person with given name and assigns ID public Person(String firstname) {
name = firstname;
id = uniqueId++;
}
// Methods
numberEmployees( ) { }
}
140public class Person {
private static int uniqueId = 0;
String name;
int id;
double hourlyRate;
double [] hours;
double [] overtime;
// Constructs a Person with given name and assigns ID public Person(String firstname) {
name = firstname;
id = uniqueId++;
}
// Methods
public static int numberEmployees( ) { return uniqueId;
}
}
141Zusammenfassung Java Klassen
§ Eine Klasse kann in einem grossen Software System:
1. Ein Program enthalten
2. Eine Objekt Klasse (d.h. Typ) definieren
3. Ein Modul definieren
Zusammenfassung Java Klassen
§ Eine Klasse kann in einem grossen Software System:
1. Ein Program enthalten: Hat eine public static main Methode und ggf. andere static Methoden.
§ Normalerweise ohne static Variable (ausser sie sind final)
§ Implementiert einen Service für Benutzer
Zusammenfassung Java Klassen
§ Eine Klasse kann in einem grossen Software System:
2. Einen Typ definieren: Die Objekt Klasse beschreibt neuen Typ von Objekten (Werte und Verhalten)
§ Deklariert Objektattribute, Konstruktoren, und Methoden
§ Deklariert möglicherweise static Variable oder Methoden, aber diese spielen i.A. eine untergeordnete Rolle
§ Ist abgekapselt ("encapsulated") – alle Attribute und static Variablen sind private
§ Beispiel von Objekt Klassen:
Point, Person, File, Random
Zusammenfassung Java Klassen
§ Eine Klasse kann in einem grossen Software System:
3. Ein Modul definieren: Wiederverwendbarer Code der durch static Methoden implementiert ist
§ Beispiel: Math, Arrays
147
Wo stehen wir?
§ Kernkonzepte für einfache Programme
§ if-else, if-else-if
§ Schleifen: for, while, do … while
§ Ausdrücke (einschliesslich Zuweisungen)
§ Änderungen der Ausführungsreihenfolge durch Methodenaufruf
§ Strukturierung in Methoden
§ Parameter
§ Rückgabewerte
148
Wo stehen wir?
§ Entwurf (einfacher) Klassen
§ Attribute
§ Erste Schritte mit Java System
§ Scanner, Math, File, PrintStream, Random
149
Wo stehen wir?
§ Deklaration von Variablen eines Basistyps
§ Deklaration von Variablen eines Referenztyps
150
Wenn Sie mehr lesen wollen
§ (und das sollten Sie …)
§ Lehrbücher
§ Java Dokumentation
151
152
S. Reges und M. Stepp, Building Java
Programs: A Back to Basics Approach, 4th Edition, Pearson, ISBN 978-0-13-432276-6.
R. Sedgewick und K. Wayne, Einführung in die Programmierung mit Java, 2011,
(Deutsch) ISBN 978-3-86894-0476-3.
153
R. Sedgewick und K. Wayne, Introduction to Programming in Java: An Interdisciplinary Approach (2nd Edition) , 2017, Addison- Wesley, ISBN 978-0-67-233784-0
S. Reges und M. Stepp, Building Java
Programs: A Back to Basics Approach, 4th
Edition, Pearson, ISBN 978-0-13-432276-6.
Java Lehrbücher
§ Es gibt viele (in vielen Sprachen)
§ Werfen Sie einen Blick auch in andere Bücher
§ Manche Bücher sind auch online verfügbar
154
Java Informationen
§ Online gibt es die Sprachbeschreibung sowie die Dokumentation der APIs
§ Wir werden im Laufe des Semesters einige Bibliotheken (und weitere Klassen) kennenlernen
§ Nutzen Sie die online Informationen
155
156
252-0027
Einführung in die Programmierung 5.0 Input/Output
Thomas R. Gross
Department Informatik ETH Zürich
157
Übersicht
§ 5.1 Output in Fenster
§ 5.2 Arbeiten mit Dateien
§ 5.3 Scanner im Einsatz/Beispiele
158
Input (soweit mit Scanner)
§ Folge von Zeichen die der Scanner liest: Token
§ Input Element
§ Erwartete Zeichen hängen von Methode (z.B. nextDouble()) ab
§ Scanner zerlegt den Inhalt einer File in Tokens
159
Input Tokens
§ Wenn eine Input File diese Zeichen (Buchstaben) enthält:
23 3.14
"John Smith"
§ Dann kann der Scanner die Tokens als Input verschiedener Typen interpretieren:
Token Type(s)
23 int, double, String
3.14 double, String
"John String
Smith" String
161Files und der Input Cursor (Zeiger)
§ Nehmen wir an, eine Datei weather.txt enthält diesen Text:
16.2 23.5
19.1 7.4 22.8
18.5 -1.8 14.9
§ Für den Scanner ist jeder Input eine Folge von Buchstaben:
16.2 23.5\n19.1 7.4 22.8\n\n18.5 -1.8 14.9\n
^
§ ^ ist der input cursor: die augenblickliche Position des Scanners.
162
Verarbeiten einer Input File
§ Der Scanner identifiziert ein Token
§ Das Token wird gelesen und an den Aufrufer des Scanners abgeliefert
§ Annahme: keine Fehler
§ Dabei wird der Cursor über die gelesenen Buchstaben geführt
§ Wir sagen der Scanner konsumiert das Token
163
Konsumieren von Input
§ Konsumieren von Tokens: Input lesen und dabei Cursor weiter bewegen
§ Aufruf von nextInt , nextDouble , etc. bewegt den Cursor hinter das aktuelle Token.
16.2 23.5\n19.1 7.4 22.8\n\n18.5 -1.8 14.9\n
^
§ Die Datei wird dabei nicht verändert
164
Konsumieren von Input, Teil 2
§ Aufruf von nextInt, nextDouble, etc. bewegt den Cursor hinter das aktuelle Token.
16.2 23.5\n19.1 7.4 22.8\n\n18.5 -1.8 14.9\n
^
double d = input.nextDouble(); // 16.2
16.2 23.5\n19.1 7.4 22.8\n\n18.5 -1.8 14.9\n
^
String s = input.next(); // "23.5"
16.2 23.5\n19.1 7.4 22.8\n\n18.5 -1.8 14.9\n
^
165
File Input Aufgabe
§ Zurück zur File mit Wetter Daten
§ Schreiben Sie ein Programm das den Temperaturunterschied
zwischen zwei aufeinander folgenden Tagen berechnet.
16.2 23.5
19.1 7.4 22.8
18.5 -1.8 14.9
16.2 to 23.5, change = 7.3 23.5 to 19.1, change = -4.4 19.1 to 7.4, change = -11.7 7.4 to 22.8, change = 15.4 22.8 to 18.5, change = -4.3 18.5 to -1.8, change = -20.3 -1.8 to 14.9, change = 16.7166
File Input Antwort
// Displays changes in temperature from data in an input file.
import java.io.*; // for File import java.util.*; // for Scanner
public class Temperatures {
public static void main(String[] args) throws FileNotFoundException {
Scanner input = new Scanner(new File("weather.txt"));
double prev = input.nextDouble(); // fencepost for (int i = 1; i <= 7; i++) {
double next = input.nextDouble();
System.out.println(prev + " to " + next +
", change = " + (next - prev));
prev = next;
} }
}
167