252-0027 Einführungin dieProgrammierungI 12:00 Finale · 2016-12-23 · Prüfungsstoff...

Post on 10-Jul-2020

1 views 0 download

Transcript of 252-0027 Einführungin dieProgrammierungI 12:00 Finale · 2016-12-23 · Prüfungsstoff...

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!