252-0027Einführung indie Programmierung I
12:00FinaleThomasR.Gross
DepartmentInformatikETHZürichCopyright(c)Pearson2013andThomasGross2016Allrightsreserved.
Uebersicht
§ 12.1Prüfungsstoff (allgemein)
§ 12.2Javaüber die"Einführung"hinaus
§ 12.3Realität undAbstraktion
2
Prüfungsstoff
§ Probeprüfung kommt.
§ Fragen undAntworten am16.1.17(10:15,hier)
§ Prüfung am30.1.17(9:00,Hönggerberg Campus)§ Prüfung aufDeutsch§ Antworten aufEnglisch akzeptiert§ [NEU]Wörterbuch erlaubt
3
Prüfungsstoff
§ Verständnis,nicht Details
§ Beispiel:"checked"Exceptionund"unchecked"Exception§ Nicht:alle Exceptions
§ Graphische Benutzeroberfläche§ Nicht Prüfungsstoff
4
§ Heutige Themen sind nicht Prüfungsstoff (sofern nicht schonvorher behandelt)
5
Abstraktion undADT
§ Zentrales Thema für dieEntwicklung vonSoftwareSystemen
§ [20.Dez.16]:"Wenn Klienten dieDatenabstraktionrespektieren (oder respektierenmüssen)"§ Programmiersprache stellt verschiedene Mittel zur Verfügung den
Klienten zu zwingen,dieDatenabstraktion zu respektieren§ private Keywordhatten wir schon kennen gelernt – aber nicht die
ganze Geschichte
8
JavaPackages
§ Sub-packages können ähnliche Namen haben sind aber nicht wirklich ineiner Packageenthalten§ java.awt enthält nicht java.awt.event
§ Gebrauch vonJavaPackages:§ Weg zusammengehörende Klassenzu bündeln§ Schafft einen Raum für Namen (`’namespace”)umNameskonflikte zu
vermeiden§ Kontrolliert Zugriff bzw bietet Schutzvor unerwünschten Zugriffen§ Erlaubt Gliederung eines grossen SoftwareProjektes
§ Paket (“package”):Eine Ansammlung vonzusammengehörenden Klassen.§ Kann auch Unter-Pakete (sub-packages)
”enthalten”.
PackagesundDateienverzeichnisse
§ Package ßà Verzeichnis (“directory”,“folder”)
§ Klasse ßà Datei
§ Eine Klasse mit Namen D inder Packagea.b.c sollte indieser Datei gespeichert sein:
a/b/c/D.class
§ (relativ zur RootIhres Projektes)§ Das"root"Verzeichnis der PackageHierarchie wird vorgeben
durch denclasspath oder ist dasVerzeichnis vondem ausjava aufgerufen wurde.
Classpath
§ classpath:DerOrt(Directory)bzw.dieOrte indem/denenJava“class”Filessucht .§ .classFile:übersetzte .javaFile
§ Der ClassPathkann beinhalten:§ Dasaktuelle "workingdirectory"indem javac /javaaufgerufen wurde
§ Bzw.EclipsedieUebersetzung durchführt§ Andere Verzeichnisse§ JARArchive(JAR:JavaArchive)§ URLs§ ...
Classpath
§ Konfiguriert inEclipse
§ Kann explizit gesetzt werden wenn manJavavonder Shellausstartet:§ java -cp /home/eprog/libs:/foo/bar/jbl MyClass
12
Deklaration einer Packagepackage packageName;
public class className { ... }
Beispiel:package pacman.model;public class Ghost extends Sprite {
...}
§ FilesGhost.java undSprite.java sollten im Folderpacman/model sein.
Importeiner Packageimport packageName.*; // all classes
Beispiel:package pacman.gui;import pacman.model.*;
public class PacManGui {...Ghost blinky = new Ghost();
}
Importeiner Package§ PacManGuimussdie“model”Packageimportieren umdie
Klassenverwenden zu können§ PacManGuimussim Folderpacman.gui liegen
15
Importeiner Klasseimport packageName.className; // one class
Beispiel:package pacman.gui;
import pacman.model.Ghost;
public class PacManGui {
Ghost blinky = new Ghost();
}
ImportvonKlassen vs.Importeiner Package
§ (Klassen)Namenskonflikte werden unterschiedlich behandelt:
§ Importeiner einzelnen Klasse gibt der Klasse einen hohenStellenwert:§ Mit import foo.* gilt:eine Klasse mit dem selben Nameindieser
Packageüberschreibt (verdeckt)dieimportierte Klasse§ Mit import foo.className gilt:dieKlasse mit dem selben Namen
verdeckt nicht dieimportierte Klasse
17
Arbeiten mit PackagesAuch ohne import können wir uns aufeine Klasse beziehen.
packageName.className
Beispiel:java.util.Scanner console =
new java.util.Scanner(java.lang.System.in);
Arbeiten mit Packages
§ Sie können sich aufKlassen(Typen)anderer Packagesbeziehen (ohne import)wenn Sie denvollständigen Namenangeben.
§ Diesist manchmal praktisch wenn es Namenskonflikte gibt:§ Beispiel:java.awt.List undjava.util.List§ Odereine Klasse importieren (unddann für dieandere den
vollständigen Namen verwenden)
20
Arbeiten mit Packages
§ DiePackageAngabe mussimmer als erstes ineiner .javaDateierscheinen§ Vor derersten Klasse/dem ersten Interface§ Nur einmal proDatei
§ Waspassiert wenn wir (wie bisher)keine Packagedeklarieren?
21
DiedefaultPackage
§ Dateien (d.h.,dieKlassen/InterfacesinderDatei),diekeinePackageDeklaration enthalten,gehören ineine namenlosedefaultPackage.
§ Klassen inder defaultPackage:§ Können nicht importiert werden§ Können nicht vonanderen Klasseninanderen Packagesverwendet
werden.
§ Kein Problemfür einfache Programme
Der defaultImport
§ DiePackagejava.lang wird implizit vonallen Packages(unddamit Programmen)importiert.import java.lang.*;
23
PackagesundSichtbarkeit
§ InJavagibt es diefolgenden Zugriffsmodifizierer (“accessmodifiers”):§ public :Sichtbar für alle anderen Klassen(nach Import).§ private :Sichtbar nur indieser Klasse (undggf.ineingeschlossenen
Klassen/Typen – später mehr).§ protected :Sichtbar nur indieser Klasse,allen Unterklassen der
Klasse,undallen anderen Klassen/Typen dieindieser Packagedeklariert sind.
§ default(package):Sichtbar indieser Klasse undallen anderenKlassen/Typen dieindieser Packagedeklariert sind.
PackagesundSichtbarkeit
§ Damit ein Attribut/eine Methode diedefaultSichtbarkeit hat,brauchen Sie keinen Modifizierer anzugeben.package pacman.model;public class Sprite {
int points; // default: visible to pacman.model.*String name; // default: visible to pacman.model.*
}
public class Xray {int direction; // default: visible in default packageString name; // default: visible in default package
}25
DasIntList Interface// Represents a list of int(egers).public interface IntList {
public void add(int value);public void add(int index, int value);public int get(int index);public int indexOf(int value);public boolean isEmpty();public void remove(int index);public void set(int index, int value);public int size();
}
public class ArrayIntList implements IntList { ...public class LinkedIntList implements IntList { ...
Verschiedene Klassen
§ Wir haben diese beiden Klassenimplementiert,dieListen(An)sammlungen realisierten:§ ArrayIntList
§ LinkedIntList
index 0 1 2value 4
2-317
frontdata next42
data next-3
data next17
Probleme§ Wir wollen Instanzen dieser Klassen im Klienten gleich behandeln§ DieListenkönnen nur intWerte speichern,nicht beliebige Objekte§ Einige Methoden sind inbeiden Klassen durch identischen Code
implementiert (Redundanz).§ DieVariante derLinkedIntList musste noch diezusätzliche
Klasse derIntNodes deklarieren.
28
Gemeinsamer Code
§ Einige derMethoden können für beide Klassendurch denselben Codeimplementiert werden (d.h.sind identisch für dieArray-basierte als auch dieKetten-basierte Klasse)
§ add(value)§ contains
§ isEmpty
Auszug aus ArrayIntList undLinkedIntList
public void add(int value) {add(size(), value);
}
public boolean contains(int value) {return indexOf(value) >= 0;
}
public boolean isEmpty() {return size() == 0;
}
30
§ Sollten wir unser Interfaceineine Klasse umwandeln?Warum/Warum nicht?
§ Können wir aufandere Weisediese (häufige)Situationbehandeln?
31
Abstrakte Klassen (“AbstractClasses”)
§ abstractclass: Eine spezielle Klasse dieeine Mischformzwischen InterfaceundKlasse ist.§ Definiert einen Superclass-Typ mit Methodendeklarationen (wie ein
Interface)undvollständigen Methoden (mit Rumpf/Body)(wie eineKlasse).
§ Wie Interfaceskönnen abstrakte Klassennicht instanziert werden(d.h.der new Operatorkann nicht Objekte diesesTyps generieren).
§ Wasgehört ineine abstrakte Klasse?§ Implementationgemeinsamen Zustandes (Attribute)oder
gemeinsamen Verhaltens dasvonallen Subclassesgeerbt werden soll(abstrakte Klassen sind Superclasses/Eltern inder Ableitungs-hierarchie)
§ Schreiben Verhalten vor,dass Subklasses implementieren müssen(Rolleeines Interfaces)
33
Abstract ClassSyntax// declaring an abstract class
public abstract class name {
...
// declaring an abstract method
// (any subclass must implement it)
public abstract type name(parameters);
}
§ Eine Klasse kann als abstract deklariert werden auch wennsie keine abstrakten Methoden enhält.
§ Esist erlaubt,Variable(aber nicht Objekte)desabstraktenTyps zu deklarieren§ Wie bei Interfaces
§ Eine Erweiterung (mittels extends)ist auch wieder abstrakt(undmussals abstract deklariert sein)sofern nicht alleabstrakten Methoden implementiert sind.
35
AbstractClassesvs.Interfaces
§ Normale Klassendiebehaupten,ein Interfacezuimplementieren,müssen alleMethoden desInterfacesimplementieren:public class Empty implements IntList {} // error
§ Abstractclasses können behaupten,ein Interfacezuimplementieren ohne Codefür dieMethoden zu enthalten –dieSubclassesmüssen dieMethoden implementieren.
public abstract class Empty implements IntList {} // ok
public class Child extends Empty {} // error
Uebung
§ Definieren sie eine geignete abstrakte Klasse für dieListen.
37
Eine abstrakte ListenKlasse// Superclass with common code for a list of integers.public abstract class AbstractIntList implements IntList {
public void add(int value) {add(size(), value);
}
public boolean contains(int value) {return indexOf(value) >= 0;
}
public boolean isEmpty() {return size() == 0;
}}
public class ArrayIntList extends AbstractIntList { …public class LinkedIntList extends AbstractIntList { ...
Abstrakte Klassen vs. Interfaces
§ Warum gibt es inJavaabstrakte Klassen undInterfaces?§ Eine abstrakte Klasse kann alles machen wasein Interfacekann,und
mehr.§ Warum sollten wir jeInterfacesverwenden?
§ Antwort:Java erlaubt nur Einfachvererbung.§ Können nur eine Superclassverwenden§ Können viele Interfacesimplementieren
§ Interfaceserlauben es uns,eine Klasse Teil einer Hierarchie seinzu lassen(wichtig für Polymorphismus)ohne dass wir Vererbung einschränken.
Abstrakte Klassen vs.Interfaces
§ Auch Interfaceserlauben es,für Methoden eineImplementationanzugeben§ Aberwir können keine Variabledeklarieren (gleich welchen Typs)
§ Kein Thema für einfaches Beispiel
42
Probleme§ Wir wollen Instanzen dieser Klassen im Klienten gleich behandeln§ DieListenkönnen nur intWerte speichern,nicht beliebige Objekte§ Einige Methoden sind inbeiden Klassen durch identischen Code
implementiert (Redundanz).§ DieVariante derLinkedIntList musste noch diezusätzliche
Klasse derIntNodes deklarieren.
45
Innerclasses
§ Innere Klasse (“innerclass”):Eine Klasse dieinnerhalb eineranderen Klasse definiert ist.§ Können als static oder non-staticKlassendefiniert werden§ Wir betrachten hier nur dieeinfachen (Standard)non-static
(geschachtelt,"nested")inneren Klassen
§ Warum:§ Innere Klassensind nicht sichtbar für andere Klassen(Abkapselung)§ Innere Objekte können dieAttributedesäusseren Objekts
lesen/modifizieren
Inner ClassSyntax// outer (enclosing) classpublic class outerName {
...
// inner (nested) classprivate class innerName {
...
}
}
Innere Klassen§ Nur der Codeindieser Datei kann dieinnere Klasse sehen oder
instanzieren.
§ Jedes innere Objekt ist mit dem äusseren Objekt,welchesesinstanzierte,verbunden undkann sodieAttribute/Methoden desäusseren Objektes lesen/modifizieren/aufrufen.§ Wenn nötig kann dasäussere Objekt über dieReferenzvariable
OuterClassName.this erreicht werden.
§ Uebung:Aendern Sie dieLinkedIntList sodass eine innereKlasse verwendet wird. 49
Generics undinnere Klassenpublic class Outer<T> {
private class Inner<T> {} // incorrect
private class Inner {} // correct}
§ Wenn dieäussere Klasse einen Typparameter deklariert dann kann dieserTypparameter auch vondeninneren Klassenverwendet werden.
§ Innere Klassensollten nicht denTypparameter erneut deklarieren (dieswürde einen 2.Typparameter deklarieren der den1.verdeckt).
EvaluationvonAusdrücken
§ Zwei Konzepte§ Precedence(Präzedenz)a+b*c➝ a+(b*c)§ Associativity(Assoziativität)
§ Links--assoziativ:a+b+c➝ (a+b)+c§ Rechts—assoziativ:x=y=z➝ (x=(y=z))
§ Dazu:Klammern umexplizit Reihenfolge anzugeben
55
EvaluationvonAusdrücken
§ Reihenfolge bestimmt durch§ Klammern§ Associativity(Assoziativität)§ Precedence(Präzedenz)
§ Ausdruck wird vonlinksnach rechts evaluiert
§ Jeder Operandwird evaluiert§ Assoziativität entscheidet worauf sich Operatorbezieht§ Operatormit höchster Präzedenz wird zuerst ausgeführt
56
58
59
P:Precedence,A:Associativity(L:left,R:right)fromhighestprecedencetolowestfrom:D.Flanagan,JavainaNutshell,O'Reilly,5thEdition,2005
Realität undAbstraktion
§ Gegebenint i;
Gilti*i >= 0 ?
public class Weird {public static void main (String[] args) {
int i = 40000;int j = 50000;System.out.println(i*i); // 1600000000System.out.println(j*j); // -1794967296
}}
62
Endliche Darstellung(en)
§ Eine int Variablewird durch 32Bitsdargestellt§ Allgemein:XhatwBitsxw-1 xw-2 ..x1 x0
§ Wir hatten früher schon gesehen wie für Xdiese AbbildungBit➜Integer (Integer(X))realisiert ist:
63
Integer(X) = xi ⋅2i
i=0
w−1
∑
Endliche Darstellung
§ Mit dieser Abbildung können wir mit wBitsZahlen inBereichvon0…2w – 1darstellen§ ZahlenohneVorzeichen("unsigned")§ SeitJava8auchinJava...
§ DieAbbildungnennenwirdaherB2U(Binary-to-Unsigned)
64
B2U(X ) = xi ⋅2i
i=0
w−1
∑
NegativeZahlen
§ Wenn wir wBitszur Verfügung haben dann ist eine praktischeDarstellung dasZweierkomplement (Two'sComplement)§ B2T– Binary-to-Two'scomplement
§ Bitw-1ist dasVorzeichenbit (daher auch "signed")§ 0:Zahl positiv§ 1:Zahl negativ
65
B2T (X ) = −xw−1 ⋅2w−1 + xi ⋅2
i
i=0
w−2
∑
Positive&negativeZahlen
§ Umuns ein Bild zu verschaffenarbeiten wir mit w==4§ UnsignedBereich:0…15§ SignedBereich:-8...7
§ (– 2w-1)…(2w-1 – 1)
§ Addition/Subtraktion könneneffizient implementiert werden§ Identische Hardwarefür signedund
unsigned 66
X B2T(X)B2U(X)0000 00001 10010 20011 30100 40101 50110 60111 7
–88–79–610–511–412–313–214–115
1000 1001 1010 1011 1100 1101 1110 1111
01234567
Positive&negativeZahlen
§ Beispiel Addition:2+42:00104:01006:0110
§ Waspassiert wenn unser Ergebnis nicht dargestellt werdenkann:§ Wrap-around
68
Positive&negativeZahlen
§ Beispiel Addition:5+45:01014:0100-7:1001
71
Wäre 9wenn wir keinVorzeichen hätten (alsomitunsignedZahlen arbeiteten)
Aberwir arbeiten mitZahlenmit Vorzeichenarbeiten (signed)
§ Daher gilt(für 4-BitAddition):7+1==-8int bigInt = Integer.MAX_VALUE;
System.out.println(bigInt); // 2147483647
System.out.println(bigInt+1); // -2147483648
§ aber ….(Java8!)sInt = Integer.toUnsignedString(bigInt);
System.out.println(sInt); // 2147483648
73
Warum ist daswichtig?§ Für int gilt(leider)nicht
§ intA > intB ⇒ (intA+1) > (intB+1)
§ Müssen sicherstellen dass unser Programm nur Werte imBereich von(– 2w-1)…(2w-1 – 1)produziert.
74
Dasist aber nicht alles …
§ Giltdenn wenigstens (a + b) + c == a + (b + c) ?§ Für int ja.
75
Realität undAbstraktion
§ Gegebendouble d, e, f;
Gilt(d + e) + f == d + ( e + f) ?
public class Weird {public static void main (String[] args) {
double d = 1e308;
System.out.println( (d + -d) + 3.14); // 3.14
System.out.println(d + (-d + 3.14)); // 0.0}
} 77
Dasist aber nicht alles …
§ Giltdenn wenigstens (a + b) + c == a + (b + c) ?§ Für int/long ja.§ Für float/double nein.
78
Vorsicht
§ wenn Ihr Programm rechnet
§ Mehr Bits(long,double vsfloat)helfen nur begrenzt
79
81
“There’snosenseinbeingprecisewhenyoudon’tevenknowwhatyou’retalkingabout.”
J.vonNeumann
Aber…erwareinStudentanderETH(Chemie)bevoresdasDepartementInformatikgab!