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{Polymorphismus, Generics, Libraries}
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: Vererbung II}
27
\begin{minipage}[b]{0.45\linewidth}
28
\inputminted[linenos=false, numbersep=5pt, tabsize=4, fontsize=\tiny, label=Animal.java, frame=lines]{java}{Animal.java}
29
\vspace{1cm}
30
\inputminted[linenos=false, numbersep=5pt, tabsize=4, fontsize=\tiny, label=Jungle.java, frame=lines]{java}{Jungle.java}
31
\end{minipage}
32
\hspace{0.5cm}
33
\begin{minipage}[b]{0.45\linewidth}
34
\inputminted[linenos=false, numbersep=5pt, tabsize=4, fontsize=\tiny, label=Cat.java, frame=lines]{java}{Cat.java}
35
\begin{itemize}
36
\item Gibt es einen Compiler-Fehler?
37
\item Gibt es einen Laufzeit-Fehler?
38
\item Gibt es eine Ausgabe? Welche?
39
\end{itemize}
40
\end{minipage}
41
\end{frame}
42
43
\begin{frame}{Quiz: Antwort}
44
\begin{minipage}[b]{0.45\linewidth}
45
\inputminted[linenos=false, numbersep=5pt, tabsize=4, fontsize=\tiny, label=Animal.java, frame=lines]{java}{Animal.java}
46
\vspace{1cm}
47
\inputminted[linenos=false, numbersep=5pt, tabsize=4, fontsize=\tiny, label=Jungle.java, frame=lines]{java}{Jungle.java}
48
\end{minipage}
49
\hspace{0.5cm}
50
\begin{minipage}[b]{0.45\linewidth}
51
\inputminted[linenos=false, numbersep=5pt, tabsize=4, fontsize=\tiny, label=Cat.java, frame=lines]{java}{Cat.java}
52
\begin{itemize}
53
\item Compiler-Fehler
54
\item The method getCatSound() is undefined for the type Animal
55
\item Thema: "`Polymorphismus"'
56
\end{itemize}
57
\end{minipage}
58
\end{frame}
59
60
\section{Polymorphismus}
61
\subsection{Allgemeines}
62
\begin{frame}{Allgemeines}
63
Motivation
64
\begin{itemize}
65
\item Eine Unterklasse kann alles, was die Oberklasse kann
66
\item[$\rightarrow$] sie hat die gleichen Methoden, wenn auch eventuell überschrieben
67
\item Eventuell ist uns die konkrete Klasse egal
68
\item oder wir benötigen einen Kontainter für viele verschiedene
69
Objekte mit einer gemeinsamen Oberklasse
70
\end{itemize}
71
72
Was ist "`Polymorphismus'"?
73
\begin{itemize}
74
\item \myCode{Animal felix = new Cat();}
75
\item \myCode{Animal[] zoo = new Animal[10];}\\
76
\myCode{zoo[0] = felix;}
77
\end{itemize}
78
\end{frame}
79
80
\subsection{Beispiel}
81
\begin{frame}{Beispiel}
82
\inputminted[linenos=true, numbersep=5pt, tabsize=4, fontsize=\small]{java}{LateBinding.java}
83
\end{frame}
84
85
\subsection{Wann wird Polymorphismus verwendet?}
86
\begin{frame}{Wann wird Polymorphismus verwendet?}
87
\begin{itemize}[<+->]
88
\item Man Benötigt eigentlich nur bestimmte Methoden (ein Interface)
89
\begin{itemize}[<+->]
90
\item Wenn ihr später aus einer LinkedList eine ArrayList macht, müsst ihr nur eine Zeile ändern!
91
\item[$\Rightarrow$] \myCode{List myList = new LinkedList();} anstelle von \myCode{LinkedList myList = new LinkedList();} schreiben
92
\end{itemize}
93
\item Man weiß zur Compile-Zeit die exakten Klassen noch nicht
94
\item Bei den Abschlussaufgaben
95
\end{itemize}
96
\end{frame}
97
98
\section{Generics}
99
\subsection{Allgemeines}
100
\begin{frame}{Allgemeines}
101
\begin{itemize}
102
\item Problem: Man schreibt genau eine verkettete Listen-Klasse
103
für genau eine Klasse (z.B. "`Bike"'), obwohl
104
die Logik (hinzufügen, entfernen, suchen) von der
105
Klasse unabhängig ist
106
\item Lösung: Generics
107
\end{itemize}
108
\end{frame}
109
110
\subsection{Verwendung}
111
\begin{frame}{Verwendung}
112
\inputminted[linenos=true, numbersep=5pt, tabsize=4, fontsize=\small]{java}{Generics-singleLines.java}
113
\begin{block}{Hinweis}
114
Ihr könnt den "`Generic-Parameter"' wie eine Variable für die
115
Bezeichnung einer Klasse verwenden.
116
\end{block}
117
\end{frame}
118
119
\subsection{Praxis}
120
\begin{frame}{Praxis}
121
\begin{block}{Arbeitsauftrag}
122
Programmiert die Einfach-verkettete Liste um, sodass sie
123
nirgends mehr "`Bike"' sondern nur noch Generics verwendet.
124
\end{block}{Arbeitsauftrag}
125
126
\begin{exampleblock}{Hinweis}
127
\begin{itemize}
128
\item URL für die Bike-Version: \href{http://goo.gl/RoiBC}{http://goo.gl/RoiBC}
129
\item Wer nur Zettel und Papier hat, implementiert die "`Node.java"'
130
komplett neu und "`SinglyLinkedList.java"' mindestens mit "`add()"'
131
\end{itemize}
132
\end{exampleblock}
133
\end{frame}
134
135
\begin{frame}{Praxis: Node}
136
\inputminted[linenos=true, numbersep=5pt, tabsize=4, fontsize=\tiny]{java}{SinglyLinkedList-Result/Node.java}
137
\end{frame}
138
139
\begin{frame}{Praxis: SinglyLinkedList}
140
\inputminted[linenos=true, numbersep=5pt, tabsize=4, fontsize=\small, firstnumber=1, firstline=1, lastline=13]{java}{SinglyLinkedList-Result/SinglyLinkedList.java}
141
\end{frame}
142
143
\subsection{Blog-Artikel}
144
\begin{frame}{Man kanns auch übertreiben}
145
Siehe Blog-Artikel "`\href{http://martin-thoma.com/java-generics/}{Java Generics}"'
146
\end{frame}
147
148
\subsection{Besonderheit}
149
\begin{frame}{Besonderheit: ?}
150
\inputminted[linenos=false, numbersep=5pt, tabsize=4, fontsize=\small, firstnumber=1, firstline=1, lastline=1]{java}{SingleLines.java}
151
Bedeutet:
152
\begin{itemize}[<+->]
153
\item Die Liste erwartet Objekte, deren Klasse \myCode{HasWord} erweitern
154
\item[$\rightarrow$] \myCode{HasWord} oder Kinder
155
\item \myCode{?} wird "`bounded wildcard"' genannt
156
\item \href{http://stackoverflow.com/a/3009779/562769}{SO 1} und \href{http://stackoverflow.com/a/1840022/562769}{SO 2}
157
\end{itemize}
158
\end{frame}
159
160
\subsection{Quiz}
161
\begin{frame}{Quiz}
162
\begin{block}{Hinweis}
163
Das folgende Quiz stammt von \href{http://www.grayman.de/quiz/java-generics-en.quiz}{www.grayman.de}.
164
Danke für die Erlaubnis, es in meine Folien einbinden zu
165
dürfen!
166
\end{block}
167
\end{frame}
168
169
\begin{frame}{Quiz}
170
\begin{block}{Frage}
171
Mit Generics hat der Compiler mehr Typ-Informationen. Explizite
172
Casts müssen als nicht so of benutzt werden.
173
174
Welche Bedeutung für die Laufzeit haben Generics?
175
\end{block}
176
177
\begin{overprint}
178
\onslide<1>
179
\begin{itemize}
180
\item Der Compiler kann mit Generics den Code besser für
181
Typen optimieren. Das, und das Wegfallen der Casts sind
182
Gründe warum der kompilierte Code mit Generics
183
\textbf{schneller} läuft als ohne
184
\item Generics haben \textbf{keinen Einfluss} auf die Laufzeit
185
\item Die erhöhte Flexibilität und Typsicherheit bedeutet,
186
dass der Compiler für jeden konkreten Typen Code aus
187
dem generischen Code erstellen mus. Das bedeutet,
188
die Programme sind \textbf{etwas langsamer}
189
\end{itemize}
190
\onslide<2>
191
Die Java Virtual Machine und der kompilierte Byte-Code sind
192
unabhängig von Generics. Der kompilierte Byte-Code mit Generics
193
unterscheidet sich nicht von Byte-Code ohne Generics. Generics
194
haben also \textbf{keinen Einfluss} auf die Laufzeit von Java-Programmen.
195
\end{overprint}
196
\end{frame}
197
198
\begin{frame}{Quiz}
199
\begin{block}{Frage}
200
\begin{minipage}[b]{0.45\linewidth}
201
\inputminted[linenos=false, numbersep=5pt, tabsize=4, fontsize=\tiny]{java}{Basket.java}
202
\end{minipage}
203
\hspace{0.5cm}
204
\begin{minipage}[b]{0.45\linewidth}
205
\inputminted[linenos=false, numbersep=5pt, tabsize=4, fontsize=\tiny,]{java}{Fruit.java}
206
\inputminted[linenos=true, numbersep=5pt, tabsize=4, fontsize=\tiny, label=In main, frame=lines]{java}{Generics-quiz-main.java}
207
\end{minipage}
208
\end{block}
209
210
\begin{overprint}
211
\onslide<1>
212
\begin{itemize}
213
\item Der source code ist OK. Es gibt weder Compiler-, noch Laufzeitfehler
214
\item Compiler-Fehler in Zeile 2
215
\item Compiler-Fehler in Zeile 3
216
\end{itemize}
217
\onslide<2>
218
\begin{itemize}
219
\item Zeile 2 ist ok
220
\item Zeile 3 verursacht einen Laufzeitfehler
221
\item Der Rückgabewert der Methode \myCode{getElement}
222
in \myCode{Basket<Fruit>} ist \myCode{Fruit}.
223
Man kann eine \myCode{Fruit}-Variable
224
keiner \myCode{Apple}-Variable ohne cast zuweisen.
225
\end{itemize}
226
\end{overprint}
227
\end{frame}
228
229
\begin{frame}{Quiz}
230
\begin{block}{Frage}
231
\inputminted[linenos=true, numbersep=5pt, tabsize=4, fontsize=\tiny, label=In main, frame=lines]{java}{Generics-quiz-main2.java}
232
\end{block}
233
234
\begin{overprint}
235
\onslide<1>
236
\begin{itemize}
237
\item Es gibt weder Laufzeit-, noch Compiler-Fehler
238
\item Compiler-Fehler in Zeile 2
239
\item Compiler-Fehler in Zeile 3
240
\item Eine \myCode{ClassCastException} tritt in Zeile 3 auf
241
\end{itemize}
242
\onslide<2>
243
\begin{itemize}
244
\item Sowohl \myCode{Apple} als auch \myCode{Orange} sind
245
\myCode{Fruit} und können in \myCode{Basket<Fruit>}
246
landen
247
\item[$\rightarrow$] Der Cast in Zeile 3 ist nötig
248
\item Die JVN überprüft während der Laufzeit den Cast in Zeile 3
249
\item[$\rightarrow$] Ein \myCode{ClassCastException} wird geworfen, da \myCode{Apple} keine \myCode{Orange} ist
250
\end{itemize}
251
\end{overprint}
252
\end{frame}
253
254
\begin{frame}{Quiz}
255
\begin{block}{Frage}
256
Welche der folgenden Zeilen kann ohne Compiler-Fehler kompilieren?
257
\inputminted[linenos=true, numbersep=5pt, tabsize=4, fontsize=\tiny]{java}{Question04.java}
258
\end{block}
259
260
\visible<2>{
261
\begin{itemize}
262
\item Generische Klassen können ohne spezifizierten Typ genutzt werden.
263
Allerdings sollte man das nicht machen und Eclipse warnt auch davor.
264
\item Korrekt sind: 1, 2, 3, 6
265
\item Grundsätzlich gilt: Rechts vom \myCode{=} darf man genauer sein als links
266
\end{itemize}
267
}
268
\end{frame}
269
270
\begin{frame}{Quiz}
271
\begin{block}{Frage}
272
\begin{minipage}[b]{0.45\linewidth}
273
\inputminted[linenos=true, numbersep=5pt, tabsize=4, fontsize=\tiny, label=SourceA.java, frame=lines]{java}{SourceA.java}
274
\inputminted[linenos=true, numbersep=5pt, tabsize=4, fontsize=\tiny, label=SourceB.java, frame=lines]{java}{SourceB.java}
275
\end{minipage}
276
\hspace{0.5cm}
277
\begin{minipage}[b]{0.45\linewidth}
278
\inputminted[linenos=true, numbersep=5pt, tabsize=4, fontsize=\tiny, label=SourceC.java, frame=lines]{java}{SourceC.java}
279
Which of the following statements are true?
280
\end{minipage}
281
\end{block}
282
283
\begin{overprint}
284
\onslide<1>
285
\begin{enumerate}[(a)]
286
\item SourceA kompiliert nicht
287
\item SourceB kompiliert mit warning(s). Es gibt keine
288
Laufzeit-Fehler
289
\item SourceC kompiliert mit warning(s). Es gibt eine
290
\myCode{ClassCastException} zur Laufzeit
291
\end{enumerate}
292
\onslide<2>
293
\begin{itemize}
294
\item (a) und (b) sind richtig.
295
\item Der Compiler kennt nicht den Typ von Elementen in b5
296
\item[$\rightarrow$] Er kann nicht garantieren, dass ein
297
Apfel in b5 eingefügt werden kann
298
\item Da \myCode{b5.setElement(..)} nicht erlaubt ist, kompiliert es nicht
299
\item SourceB wird so behandelt, als ob es pre-Java 1.5 Code wäre
300
\end{itemize}
301
\end{overprint}
302
\end{frame}
303
304
\begin{frame}{Frage}
305
Sollen wir die restlichen 9 Fragen auf \href{http://www.grayman.de/quiz/java-generics-en.quiz}{grayman.de} machen?
306
\end{frame}
307
308
\section{Einschub: Libraries}
309
\subsection{Warum heißen Bibliotheken so?}
310
\begin{frame}{Einschub: Libaries}
311
Warum heißen Programmbibliotheken "`Bibliotheken"'?
312
313
314
$\rightarrow$ \href{http://www.rrze.uni-erlangen.de/wir-ueber-uns/publikationen/das-rrze-der-film.shtml}{Video `"RRZE1973-MPEG-1.mpg'" der Uni Erlangen}
315
\end{frame}
316
317
\section{Abspann}
318
\subsection{Kommende Tutorien}
319
\begin{frame}{Kommende Tutorien}
320
\begin{itemize}
321
\item[-] 24.12.2012: Heiligabend - \href{http://www.fmc.uni-karlsruhe.de/faq/wann-sind-die-weihnachtsferien}{Kein Tutorium}
322
\item[-] 31.12.2012: Silvester - Kein Tutorium
323
\item[4.] 07.01.2013
324
\item[3.] 14.01.2013
325
\item[2.] 21.01.2013
326
\item[1.] 28.01.2013: Abschlussprüfunsvorbereitung
327
\item[0.] 04.02.2013: Abschlussprüfunsvorbereitung
328
\item[-] 10.02.2013: Ende der Vorlesungszeit des WS 2012/2013 (\href{http://www.kit.edu/studieren/2873.php}{Quelle})
329
\end{itemize}
330
\end{frame}
331
332
\framedgraphic{Frohe Weihnachten!}{../images/xkcd-incident.png}
333
334
\end{document}
335
336