Book a Demo!
CoCalc Logo Icon
StoreFeaturesDocsShareSupportNewsAboutPoliciesSign UpSign In
Download

📚 The CoCalc Library - books, templates and other resources

132931 views
License: OTHER
1
\documentclass[usepdftitle=false,hyperref={pdfpagelabels=false}]{beamer}
2
\usepackage{../templates/myStyle}
3
4
\begin{document}
5
\title{\titleText}
6
\subtitle{Überladung, Bindung, List, Dictionarys}
7
\author{\tutor}
8
\date{\today}
9
\subject{Programmieren}
10
11
\frame{\titlepage}
12
13
\frame{
14
\frametitle{Inhaltsverzeichnis}
15
\setcounter{tocdepth}{1}
16
\tableofcontents
17
\setcounter{tocdepth}{2}
18
}
19
20
%\AtBeginSection[]{
21
% \InsertToC[sections={\thesection}] % shows only subsubsections of one subsection
22
%}
23
24
\section{Einleitung}
25
\subsection{Quiz}
26
\begin{frame}{Quiz}
27
\inputminted[linenos=true, numbersep=5pt, tabsize=4, fontsize=\tiny,frame=lines,label=Main.java]{java}{QuizMain.java}
28
\inputminted[linenos=true, numbersep=5pt, tabsize=4, fontsize=\tiny]{java}{CrazyDataStructure.java}
29
\inputminted[linenos=true, numbersep=5pt, tabsize=4, fontsize=\tiny]{java}{ListLike.java}
30
\inputminted[linenos=true, numbersep=5pt, tabsize=4, fontsize=\tiny]{java}{ArrayListLike.java}
31
\begin{itemize}
32
\item Gibt es einen Compiler-Fehler?
33
\item Gibt es einen Laufzeit-Fehler?
34
\item Alles klappt
35
\end{itemize}
36
\end{frame}
37
38
\begin{frame}{Quiz: Antwort}
39
\begin{block}{Antwort}
40
Alles klappt. Da ArrayListLike von ListLike erbt, erbt die
41
Klasse natürlich auch die Methoden. Insbesondere erbt sie
42
die Methoden, die CrazyDataStructure erwartet. Also
43
implementiert auch ArrayListLike das Interface ListLike,
44
obwohl es nicht explizit dort steht.
45
\end{block}
46
\end{frame}
47
48
\section{Überladung}
49
\subsection{Musterlösung}
50
\begin{frame}{Musterlösung}
51
Eine Musterlösung zu Blatt 5 ist
52
\href{https://github.com/MartinThoma/prog-ws1213/tree/master/Blatt-05/tutor-solution/Blatt5/src/mediabib}{hier}.
53
\end{frame}
54
55
\begin{frame}{Überladung}
56
\begin{exampleblock}{Allgemein}
57
\begin{enumerate}[<+->]
58
\item \myCode{void myFunction(int a);} und \myCode{void myFunction();}
59
\item \myCode{int myFunction();} und \myCode{double myFunction();}
60
\begin{itemize}
61
\item Geht in Java nicht
62
\item Funktioniert aber in Perl und Haskell (\href{http://stackoverflow.com/a/442291/562769}{Quelle})
63
\end{itemize}
64
\item \myCode{void myFunction();} und \myCode{int myFunction(int a);}
65
\item \myCode{void myFunction(String a);} und \myCode{void myFunction(int a);}
66
\item \myCode{void myFunction(String a);} und \myCode{void myFunction(int a, int b);}
67
\item \myCode{void myFunction(String a, int b);} und \myCode{void myFunction(int b, String a);}
68
\end{enumerate}
69
\end{exampleblock}
70
\end{frame}
71
72
\begin{frame}{Überladung}
73
So was geht nicht:
74
\begin{itemize}[<+->]
75
\item \myCode{void myFunction(int a, int b);} und \myCode{void myFunction(int b, int a);}
76
\item \myCode{void myFunction(String a, int b);} und \myCode{void myFunction(String b, int a);}
77
\item[$\Rightarrow$] Für den Compiler ist der Bezeichner "`a"' bzw. "`b"' in der Signatur egal\\
78
Dort sind nur der Rückgabewert, der Name der Methode und die Parameter-Typen und deren Reihenfolge wichtig\\
79
In Java nicht mal der Rückgabewert
80
\end{itemize}
81
\end{frame}
82
83
\begin{frame}{Überladung}
84
\begin{block}{\href{http://docs.oracle.com/javase/specs/jls/se7/jls7.pdf}{Java Language Specification}, 8.4.2}
85
Two methods have the same signature if they have the same name and argument types.
86
\end{block}
87
88
Beispiele:
89
\begin{itemize}
90
\item \href{http://docs.oracle.com/javase/7/docs/api/java/lang/Math.html\#signum(double)}{Math.signum(double)},
91
\href{http://docs.oracle.com/javase/7/docs/api/java/lang/Math.html\#signum(float)}{Math.signum(float)}
92
\item PrintStream:
93
\href{http://docs.oracle.com/javase/7/docs/api/java/io/PrintStream.html\#println()}{println();},
94
\href{http://docs.oracle.com/javase/7/docs/api/java/io/PrintStream.html\#println(boolean)}{println(boolean);},
95
\href{http://docs.oracle.com/javase/7/docs/api/java/io/PrintStream.html\#println(char)}{println(char);} \dots
96
\item Interface List:
97
\href{http://docs.oracle.com/javase/7/docs/api/java/util/List.html\#toArray()}{Object[] toArray();},
98
\href{http://docs.oracle.com/javase/7/docs/api/java/util/List.html\#toArray(T[])}{<T> T[] toArray(T[] a)}
99
\end{itemize}
100
\end{frame}
101
102
\section{Bindung}
103
\subsection{Allgemeines}
104
\framedgraphic{Bindung}{Bindung.png}
105
106
\begin{frame}{"`Early Binding"' und "`Late Binding"'}
107
Bindung kann für jeweils ein Objekt zu zwei Zeitpunkten stattfinden:
108
\begin{block}{Early binding, static binding, compile-time-binding}
109
References are resolved at compile time:
110
\inputminted[linenos=false, numbersep=5pt, tabsize=4, fontsize=\small, firstline=5, lastline=7]{java}{singleLines.java}
111
\end{block}
112
113
\begin{block}{Late binding, dynamic binding, run-time-binding}
114
References are resolved at run time:
115
\inputminted[linenos=false, numbersep=5pt, tabsize=4, fontsize=\small, firstline=9, lastline=13]{java}{singleLines.java}
116
\end{block}
117
{\tiny Quelle: \href{http://stackoverflow.com/a/640990/562769}{StackOverflow}}
118
\end{frame}
119
120
\begin{frame}{Weitere}
121
\begin{itemize}
122
\item \href{http://en.wikipedia.org/wiki/Loose_coupling}{Loose coupling} (Lose Kopplung)
123
\item Loose binding - nicht weit verbreitet, vermutlich falscher Begriff
124
\item \href{http://en.wikipedia.org/wiki/Dynamic_dispatch}{Dynamic dispatch}:
125
Laut Wikipedia das gleiche wie "`dynamic binding"'.
126
\end{itemize}
127
\end{frame}
128
129
\begin{frame}{"`Dynamic Binding"' und "`Dynamic dispatch"'}
130
\begin{itemize}
131
\item \href{http://en.wikipedia.org/wiki/Dynamic_dispatch\#Single_and_multiple_dispatch}{Single and multiple dispatch} - Java unterstützt nur single dispatch
132
\item \href{http://stackoverflow.com/questions/533330/dynamic-dispatch-and-binding}{Are dynamic dispatch and dynamic binding the same thing?} - No.
133
\item Aber: Late binding and dynamic single dispatch are, for all intents and purposes, the same. (\href{http://stackoverflow.com/a/9470993/562769}{Quelle})
134
\item Paper "`\href{http://homepages.mcs.vuw.ac.nz/~alex/files/MuscheviciPotaninTemperoNobleOOPSLA2008.pdf}{Multiple Dispatch in Practice}"'
135
\end{itemize}
136
\end{frame}
137
138
\section{Nachbesprechung}
139
\subsection{Polymorphismus nutzen}
140
\begin{frame}{Polymorphismus}
141
\begin{itemize}
142
\item Was ihr schreibt:
143
\inputminted[linenos=false, numbersep=5pt, tabsize=4, fontsize=\small, firstline=1, lastline=1]{java}{singleLines.java}
144
\item Besser wäre:
145
\inputminted[linenos=false, numbersep=5pt, tabsize=4, fontsize=\small, firstline=2, lastline=2]{java}{singleLines.java}
146
\item Nicht vergessen:
147
\inputminted[linenos=false, numbersep=5pt, tabsize=4, fontsize=\small, firstline=3, lastline=3]{java}{singleLines.java}
148
\end{itemize}
149
150
Warum ist Polymorphismus toll?
151
\begin{itemize}
152
\item siehe \href{http://www.artima.com/objectsandjava/webuscript/PolymorphismInterfaces1.html}{Polymorphism and Interfaces}
153
\item siehe 9. Tutorium
154
\end{itemize}
155
\end{frame}
156
157
\subsection{Interne Comparatoren}
158
\begin{frame}{Interne Comparatoren}
159
\inputminted[linenos=true, numbersep=5pt, tabsize=4, fontsize=\tiny]{java}{InternalComparator.java}
160
{\tiny \href{http://martin-thoma.com/how-to-sort-with-java/\#Internal_anonymous_Comparator}{Quelle}}
161
\end{frame}
162
163
\subsection{switch und String}
164
\begin{frame}{switch und String}
165
\begin{itemize}[<+->]
166
\item Erst mit Java SE 7 kann man \myCode{switch} auf eine Variable vom Typ \myCode{String} anwenden
167
\item \dots 16 Jahre nach dem Feature Request! (\href{http://bugs.sun.com/bugdatabase/view_bug.do?bug_id=1223179}{Quelle})
168
\item Vorher: \myCode{Cannot switch on a value of type String.}\\
169
\myCode{Only int values or enum constants are permitted}
170
\item Problem: Strings sind Objekte
171
\item Java-Puzzle: \myCode{new String("{}abc") != "{}abc";}
172
\item Java verwendet \myCode{.equals()} (\href{http://docs.oracle.com/javase/tutorial/java/nutsandbolts/switch.html}{Quelle})
173
\item \href{http://stackoverflow.com/a/338230/562769}{Mehr infos}
174
\end{itemize}
175
\end{frame}
176
177
\begin{frame}{switch und String}
178
Früher hat man einen Enum verwendet:
179
\inputminted[linenos=false, numbersep=5pt, tabsize=4, fontsize=\small]{java}{Switch.java}
180
\end{frame}
181
182
\subsection{Annotationen}
183
\begin{frame}{Quiz}
184
\inputminted[linenos=true, numbersep=5pt, tabsize=4, fontsize=\tiny, frame=lines, label=Person.java]{java}{PersonQuiz.java}
185
\inputminted[linenos=true, numbersep=5pt, tabsize=4, fontsize=\tiny]{java}{AnnotationQuiz.java}
186
\end{frame}
187
188
\begin{frame}{Quiz: Antwort}
189
\begin{block}{Compiler-Fehler}
190
Exception in thread "main" java.lang.Error: \\
191
Unresolved compilation problem: \\
192
The method shout() of type Person must override or implement a supertype method\\
193
at Person.shout(Person.java:12)\\
194
at Main.main(Main.java:4)
195
\end{block}
196
\end{frame}
197
198
\begin{frame}{@Override-Annotation}
199
Die Annotation \myCode{@Override} \dots
200
\begin{itemize}[<+->]
201
\item Sollte verwendet werden, damit der Compiler euch warnen
202
kann, wenn ihr nichts überschreibt
203
\item[$\Rightarrow$] Tippfehler werden unwahrscheinlicher
204
\item Anderen ist klar, dass euch klar war, dass ihr etwas
205
überschreibt
206
\item Code ist leichter verständlich
207
\end{itemize}
208
\end{frame}
209
210
\begin{frame}{@author-Annotation}
211
\begin{itemize}
212
\item Für die Klausur bitte \myCode{@author} verwenden
213
\item und euren korrekten Namen angeben
214
\item In Eclipse: \menu{Window > Preferences > Java > Code Style > Code Templates > Comments > Types}
215
und dort \myCode{\$\{user\}} durch euren Namen ersetzen
216
\end{itemize}
217
\end{frame}
218
219
\subsection{Aufbau einer Klasse}
220
\begin{frame}{Aufbau einer Klasse}
221
Folgender Aufbau ist Konvention und sollte eingehalten werden:
222
\begin{enumerate}
223
\item Class/interface documentation comment (/**...*/)
224
\item class or interface statement
225
\item Class/interface implementation comment (/*...*/), if necessary
226
\item Class (static) variables
227
\item \textbf{Instance variables}
228
\item \textbf{Constructors}
229
\item \textbf{Methods}
230
\end{enumerate}
231
Quelle: \href{http://www.oracle.com/technetwork/java/codeconventions-150003.pdf}{Oracle Coding Convetions}, 3.1.3
232
\end{frame}
233
234
\section{Java API: List}
235
\subsection{Allgemeines}
236
\begin{frame}{Allgemeines}
237
Es gibt in \myCode{java.utils.*}
238
\begin{itemize}[<+->]
239
\item \href{http://docs.oracle.com/javase/7/docs/api/java/util/List.html}{Interface List<E>}
240
\begin{itemize}
241
\item \myCode{add(E e)}, \myCode{contains(Object o)}, \myCode{get(int index)}, \myCode{remove(Object o)}
242
\end{itemize}
243
244
\item \href{http://docs.oracle.com/javase/7/docs/api/java/util/ArrayList.html}{Class ArrayList<E>}
245
\begin{itemize}
246
\item Stärken: get, add $\in \mathcal{O}(1)$ - add nur amortisiert!
247
\item Schwächen: remove $\in \mathcal{O}(n)$
248
\end{itemize}
249
250
\item \href{http://docs.oracle.com/javase/7/docs/api/java/util/LinkedList.html}{Class LinkedList<E>}
251
\begin{itemize}
252
\item Stärken: add $\in \mathcal{O}(1)$
253
\item Schwächen: get, remove $\in \mathcal{O}(n)$, Speicherplatz
254
\end{itemize}
255
\item[$\Rightarrow$] LinkedList nur dann, wenn ihr add sehr häufig nutzt
256
\end{itemize}
257
258
Siehe: \href{http://stackoverflow.com/q/322715/562769}{When to use LinkedList<> over ArrayList<>?}
259
\end{frame}
260
261
\begin{frame}{List: Beispiel}
262
\inputminted[linenos=true, numbersep=5pt, tabsize=4, fontsize=\tiny]{java}{ListExample.java}
263
\end{frame}
264
265
\begin{frame}{Ausgabe}
266
\begin{itemize}
267
\item myList: [41, 35, 9, 51, 35]
268
\item anotherList: [2, 51, 64, 58, 57]
269
\item combined: [2, 9, 35, 35, 41, 51, 51, 57, 58, 64]
270
\end{itemize}
271
\end{frame}
272
273
\begin{frame}{ArrayList vs. Vector}
274
\begin{itemize}
275
\item \href{http://docs.oracle.com/javase/7/docs/api/java/util/ArrayList.html}{ArrayList} und \href{http://docs.oracle.com/javase/7/docs/api/java/util/Vector.html}{Vector} sind praktisch identisch
276
\item Einziger Unterschied: Vector ist synchronized
277
\item[$\Rightarrow$] In Single-Thread-Anwendungen immer ArrayList verwenden
278
\item[$\Rightarrow$] Für die Abschlussaufgabe auf keinen Fall Vektor verwenden
279
\item Vector war bei mir mehr als $2 \times$ so langsam wie ArrayList ($\rightarrow$ \href{http://martin-thoma.com/matrix-multiplication-python-java-cpp/\#Java}{Performance of Matrix multiplication in Python, Java and C++})
280
\end{itemize}
281
\end{frame}
282
283
\section{Dictionary}
284
\subsection{Allgemeines}
285
\begin{frame}{Allgemeines}
286
\begin{itemize}[<+->]
287
\item \href{http://docs.oracle.com/javase/7/docs/api/java/util/Dictionary.html}{Dictionary}
288
is obsolete. New implementations should implement the
289
\href{http://docs.oracle.com/javase/7/docs/api/java/util/Map.html}{Map}
290
interface, rather than extending Dictionary.
291
\item Telefonbuch-Anwendungsfälle
292
\begin{itemize}
293
\item Schlüssel wird auf Wert abgebildet
294
\item Beides sind Objekte
295
\item Schlüssel ist eindeutig, Wert darfs mehrfach geben (sowohl identisch als auch gleich sind ok)
296
\end{itemize}
297
\item Interface Map links vom \myCode{=}
298
\item \href{http://docs.oracle.com/javase/7/docs/api/java/util/HashMap.html}{HashMap}:
299
\begin{itemize}
300
\item makes no guarantees as to the order of the map
301
\item $\mathcal{O}(1)$ für \myCode{get} und \myCode{put}
302
\end{itemize}
303
\item \href{http://docs.oracle.com/javase/7/docs/api/java/util/TreeMap.html}{TreeMap}:
304
\begin{itemize}
305
\item sorted according to the natural ordering of its keys
306
\item $\mathcal{O}(\log n)$ für \myCode{containsKey}, \myCode{get}, \myCode{put} und \myCode{remove}
307
\end{itemize}
308
\item \href{http://docs.oracle.com/javase/7/docs/api/java/util/LinkedHashMap.html}{LinkedHashMap}:
309
\begin{itemize}
310
\item predictable iteration order (usually insertion-order)
311
\item $\mathcal{O}(1)$ für \myCode{add} und \myCode{remove}
312
\end{itemize}
313
\end{itemize}
314
\end{frame}
315
316
\subsection{Beispiele}
317
\begin{frame}{Beispiel 1}
318
\inputminted[linenos=false, numbersep=5pt, tabsize=4, fontsize=\small]{java}{MapSimple.java}
319
http://stackoverflow.com/questions/2889777/difference-between-hashmap-linkedhashmap-and-sortedmap-in-java
320
\end{frame}
321
322
\begin{frame}{Beispiel 2.1}
323
\inputminted[linenos=false, numbersep=5pt, tabsize=4, fontsize=\tiny, frame=lines,label=Person.java]{java}{Person.java}
324
\inputminted[linenos=false, numbersep=5pt, tabsize=4, fontsize=\tiny, frame=lines,label=TelephoneNumber.java]{java}{TelephoneNumber.java}
325
\end{frame}
326
327
\begin{frame}{Beispiel 2.2}
328
\inputminted[linenos=true, numbersep=5pt, tabsize=4, fontsize=\small]{java}{MapSimple2.java}
329
\end{frame}
330
331
\begin{frame}{Beispiel 2.3: Durch Map iterieren}
332
\inputminted[linenos=false, numbersep=5pt, tabsize=4, fontsize=\small, firstline=15, lastline=20]{java}{singleLines.java}
333
\end{frame}
334
335
\section{Swing}
336
\subsection{Basics}
337
\begin{frame}{Basics: Ein Fenster}
338
\inputminted[linenos=false, numbersep=5pt, tabsize=4, fontsize=\tiny]{java}{Swing1.java}
339
\end{frame}
340
\framedgraphic{Basics: Ein Fenster}{java-swing-jpanel.png}
341
342
\subsection{ActionListener}
343
\begin{frame}{ActionListener}
344
ActionLister sind \dots
345
\begin{itemize}[<+->]
346
\item ein weit verbreitetes Konzept
347
\item Objekte, die auf bestimmte Aktionen warten und
348
\begin{itemize}
349
\item dann was machen
350
\item die Aktion "`delegieren"'
351
\end{itemize}
352
\item das \href{http://docs.oracle.com/javase/7/docs/api/java/awt/event/ActionListener.html}{Interface ActionListener}
353
\end{itemize}
354
\end{frame}
355
356
\begin{frame}{ActionListener}
357
\inputminted[linenos=false, numbersep=5pt, tabsize=4, fontsize=\tiny]{java}{Swing2.java}
358
{\tiny \href{http://martin-thoma.com/how-to-use-swing/}{complete source}}
359
\end{frame}
360
361
362
363
\section{Abspann}
364
\subsection{Kommende Tutorien}
365
\begin{frame}{Kommende Tutorien: Themen?}
366
\begin{itemize}
367
\item \href{http://zetcode.com/tutorials/javagamestutorial/}{Snake}
368
\item Space Invaders
369
\item Breakout
370
\item Tetris
371
\item Minesweeper
372
\item Sokoban
373
\item Swing (Fenster in Java)
374
\item Port-Scanner
375
\item Multiprocessing (Matrix-Multiplikation auf mehreren Kernen)
376
\item Web-Crawler
377
\item PageRank auf reale Daten anwenden
378
\item Chat
379
\item[$\Rightarrow$] Bitte auf \href{http://www.doodle.com/drn5f9i94zedws5n}{Doodle} wählen!
380
\end{itemize}
381
\end{frame}
382
383
\begin{frame}{Disclaimer}
384
Bei wem steht noch \dots
385
\begin{itemize}
386
\item Einverständniserklärung nicht im Praktomaten registriert
387
\item Prüfungsanmeldung nicht im Praktomaten registriert
388
\end{itemize}
389
\end{frame}
390
391
\begin{frame}{Mathe-Studenten}
392
\begin{itemize}
393
\item Was der Prof. über den Verteilger geschrieben hat war Unfug.
394
\item Zulassungsbescheinigung über Studienbüro (blauer Schein)
395
\item Vermutlich kein Übungsschein
396
\item Nur für die Klausur
397
\end{itemize}
398
\end{frame}
399
400
\begin{frame}{Kommende Tutorien}
401
\begin{itemize}
402
\item[2.] 21.01.2013
403
\item[1.] 28.01.2013: Abschlussprüfunsvorbereitung
404
\item[-] 28.01.2013: Ausgabetermin für Teil 1
405
\item[0.] 04.02.2013: Abschlussprüfunsvorbereitung
406
\item[-] 10.02.2013: Ende der Vorlesungszeit des WS 2012/2013 (\href{http://www.kit.edu/studieren/2873.php}{Quelle})
407
\end{itemize}
408
\end{frame}
409
410
\framedgraphic{Vielen Dank für eure Aufmerksamkeit!}{../images/geekandpoke-2009-10-naming-conventions.jpg}
411
412
\end{document}
413
414