tutorium-09.tex 13 KB

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