📚 The CoCalc Library - books, templates and other resources
cocalc-examples / martinthoma-latex-examples / presentations / Programmieren-Tutorium / Tutorium-09 / tutorium-09.tex
132940 viewsLicense: OTHER
\documentclass[usepdftitle=false,hyperref={pdfpagelabels=false}]{beamer}1\usepackage{../templates/myStyle}23\begin{document}4\title{\titleText}5\subtitle{Polymorphismus, Generics, Libraries}6\author{\tutor}7\date{\today}8\subject{Programmieren}910\frame{\titlepage}1112\frame{13\frametitle{Inhaltsverzeichnis}14\setcounter{tocdepth}{1}15\tableofcontents16\setcounter{tocdepth}{2}17}1819%\AtBeginSection[]{20% \InsertToC[sections={\thesection}] % shows only subsubsections of one subsection21%}2223\section{Einleitung}24\subsection{Quiz}25\begin{frame}{Quiz: Vererbung II}26\begin{minipage}[b]{0.45\linewidth}27\inputminted[linenos=false, numbersep=5pt, tabsize=4, fontsize=\tiny, label=Animal.java, frame=lines]{java}{Animal.java}28\vspace{1cm}29\inputminted[linenos=false, numbersep=5pt, tabsize=4, fontsize=\tiny, label=Jungle.java, frame=lines]{java}{Jungle.java}30\end{minipage}31\hspace{0.5cm}32\begin{minipage}[b]{0.45\linewidth}33\inputminted[linenos=false, numbersep=5pt, tabsize=4, fontsize=\tiny, label=Cat.java, frame=lines]{java}{Cat.java}34\begin{itemize}35\item Gibt es einen Compiler-Fehler?36\item Gibt es einen Laufzeit-Fehler?37\item Gibt es eine Ausgabe? Welche?38\end{itemize}39\end{minipage}40\end{frame}4142\begin{frame}{Quiz: Antwort}43\begin{minipage}[b]{0.45\linewidth}44\inputminted[linenos=false, numbersep=5pt, tabsize=4, fontsize=\tiny, label=Animal.java, frame=lines]{java}{Animal.java}45\vspace{1cm}46\inputminted[linenos=false, numbersep=5pt, tabsize=4, fontsize=\tiny, label=Jungle.java, frame=lines]{java}{Jungle.java}47\end{minipage}48\hspace{0.5cm}49\begin{minipage}[b]{0.45\linewidth}50\inputminted[linenos=false, numbersep=5pt, tabsize=4, fontsize=\tiny, label=Cat.java, frame=lines]{java}{Cat.java}51\begin{itemize}52\item Compiler-Fehler53\item The method getCatSound() is undefined for the type Animal54\item Thema: "`Polymorphismus"'55\end{itemize}56\end{minipage}57\end{frame}5859\section{Polymorphismus}60\subsection{Allgemeines}61\begin{frame}{Allgemeines}62Motivation63\begin{itemize}64\item Eine Unterklasse kann alles, was die Oberklasse kann65\item[$\rightarrow$] sie hat die gleichen Methoden, wenn auch eventuell überschrieben66\item Eventuell ist uns die konkrete Klasse egal67\item oder wir benötigen einen Kontainter für viele verschiedene68Objekte mit einer gemeinsamen Oberklasse69\end{itemize}7071Was ist "`Polymorphismus'"?72\begin{itemize}73\item \myCode{Animal felix = new Cat();}74\item \myCode{Animal[] zoo = new Animal[10];}\\75\myCode{zoo[0] = felix;}76\end{itemize}77\end{frame}7879\subsection{Beispiel}80\begin{frame}{Beispiel}81\inputminted[linenos=true, numbersep=5pt, tabsize=4, fontsize=\small]{java}{LateBinding.java}82\end{frame}8384\subsection{Wann wird Polymorphismus verwendet?}85\begin{frame}{Wann wird Polymorphismus verwendet?}86\begin{itemize}[<+->]87\item Man Benötigt eigentlich nur bestimmte Methoden (ein Interface)88\begin{itemize}[<+->]89\item Wenn ihr später aus einer LinkedList eine ArrayList macht, müsst ihr nur eine Zeile ändern!90\item[$\Rightarrow$] \myCode{List myList = new LinkedList();} anstelle von \myCode{LinkedList myList = new LinkedList();} schreiben91\end{itemize}92\item Man weiß zur Compile-Zeit die exakten Klassen noch nicht93\item Bei den Abschlussaufgaben94\end{itemize}95\end{frame}9697\section{Generics}98\subsection{Allgemeines}99\begin{frame}{Allgemeines}100\begin{itemize}101\item Problem: Man schreibt genau eine verkettete Listen-Klasse102für genau eine Klasse (z.B. "`Bike"'), obwohl103die Logik (hinzufügen, entfernen, suchen) von der104Klasse unabhängig ist105\item Lösung: Generics106\end{itemize}107\end{frame}108109\subsection{Verwendung}110\begin{frame}{Verwendung}111\inputminted[linenos=true, numbersep=5pt, tabsize=4, fontsize=\small]{java}{Generics-singleLines.java}112\begin{block}{Hinweis}113Ihr könnt den "`Generic-Parameter"' wie eine Variable für die114Bezeichnung einer Klasse verwenden.115\end{block}116\end{frame}117118\subsection{Praxis}119\begin{frame}{Praxis}120\begin{block}{Arbeitsauftrag}121Programmiert die Einfach-verkettete Liste um, sodass sie122nirgends mehr "`Bike"' sondern nur noch Generics verwendet.123\end{block}{Arbeitsauftrag}124125\begin{exampleblock}{Hinweis}126\begin{itemize}127\item URL für die Bike-Version: \href{http://goo.gl/RoiBC}{http://goo.gl/RoiBC}128\item Wer nur Zettel und Papier hat, implementiert die "`Node.java"'129komplett neu und "`SinglyLinkedList.java"' mindestens mit "`add()"'130\end{itemize}131\end{exampleblock}132\end{frame}133134\begin{frame}{Praxis: Node}135\inputminted[linenos=true, numbersep=5pt, tabsize=4, fontsize=\tiny]{java}{SinglyLinkedList-Result/Node.java}136\end{frame}137138\begin{frame}{Praxis: SinglyLinkedList}139\inputminted[linenos=true, numbersep=5pt, tabsize=4, fontsize=\small, firstnumber=1, firstline=1, lastline=13]{java}{SinglyLinkedList-Result/SinglyLinkedList.java}140\end{frame}141142\subsection{Blog-Artikel}143\begin{frame}{Man kanns auch übertreiben}144Siehe Blog-Artikel "`\href{http://martin-thoma.com/java-generics/}{Java Generics}"'145\end{frame}146147\subsection{Besonderheit}148\begin{frame}{Besonderheit: ?}149\inputminted[linenos=false, numbersep=5pt, tabsize=4, fontsize=\small, firstnumber=1, firstline=1, lastline=1]{java}{SingleLines.java}150Bedeutet:151\begin{itemize}[<+->]152\item Die Liste erwartet Objekte, deren Klasse \myCode{HasWord} erweitern153\item[$\rightarrow$] \myCode{HasWord} oder Kinder154\item \myCode{?} wird "`bounded wildcard"' genannt155\item \href{http://stackoverflow.com/a/3009779/562769}{SO 1} und \href{http://stackoverflow.com/a/1840022/562769}{SO 2}156\end{itemize}157\end{frame}158159\subsection{Quiz}160\begin{frame}{Quiz}161\begin{block}{Hinweis}162Das folgende Quiz stammt von \href{http://www.grayman.de/quiz/java-generics-en.quiz}{www.grayman.de}.163Danke für die Erlaubnis, es in meine Folien einbinden zu164dürfen!165\end{block}166\end{frame}167168\begin{frame}{Quiz}169\begin{block}{Frage}170Mit Generics hat der Compiler mehr Typ-Informationen. Explizite171Casts müssen als nicht so of benutzt werden.172173Welche Bedeutung für die Laufzeit haben Generics?174\end{block}175176\begin{overprint}177\onslide<1>178\begin{itemize}179\item Der Compiler kann mit Generics den Code besser für180Typen optimieren. Das, und das Wegfallen der Casts sind181Gründe warum der kompilierte Code mit Generics182\textbf{schneller} läuft als ohne183\item Generics haben \textbf{keinen Einfluss} auf die Laufzeit184\item Die erhöhte Flexibilität und Typsicherheit bedeutet,185dass der Compiler für jeden konkreten Typen Code aus186dem generischen Code erstellen mus. Das bedeutet,187die Programme sind \textbf{etwas langsamer}188\end{itemize}189\onslide<2>190Die Java Virtual Machine und der kompilierte Byte-Code sind191unabhängig von Generics. Der kompilierte Byte-Code mit Generics192unterscheidet sich nicht von Byte-Code ohne Generics. Generics193haben also \textbf{keinen Einfluss} auf die Laufzeit von Java-Programmen.194\end{overprint}195\end{frame}196197\begin{frame}{Quiz}198\begin{block}{Frage}199\begin{minipage}[b]{0.45\linewidth}200\inputminted[linenos=false, numbersep=5pt, tabsize=4, fontsize=\tiny]{java}{Basket.java}201\end{minipage}202\hspace{0.5cm}203\begin{minipage}[b]{0.45\linewidth}204\inputminted[linenos=false, numbersep=5pt, tabsize=4, fontsize=\tiny,]{java}{Fruit.java}205\inputminted[linenos=true, numbersep=5pt, tabsize=4, fontsize=\tiny, label=In main, frame=lines]{java}{Generics-quiz-main.java}206\end{minipage}207\end{block}208209\begin{overprint}210\onslide<1>211\begin{itemize}212\item Der source code ist OK. Es gibt weder Compiler-, noch Laufzeitfehler213\item Compiler-Fehler in Zeile 2214\item Compiler-Fehler in Zeile 3215\end{itemize}216\onslide<2>217\begin{itemize}218\item Zeile 2 ist ok219\item Zeile 3 verursacht einen Laufzeitfehler220\item Der Rückgabewert der Methode \myCode{getElement}221in \myCode{Basket<Fruit>} ist \myCode{Fruit}.222Man kann eine \myCode{Fruit}-Variable223keiner \myCode{Apple}-Variable ohne cast zuweisen.224\end{itemize}225\end{overprint}226\end{frame}227228\begin{frame}{Quiz}229\begin{block}{Frage}230\inputminted[linenos=true, numbersep=5pt, tabsize=4, fontsize=\tiny, label=In main, frame=lines]{java}{Generics-quiz-main2.java}231\end{block}232233\begin{overprint}234\onslide<1>235\begin{itemize}236\item Es gibt weder Laufzeit-, noch Compiler-Fehler237\item Compiler-Fehler in Zeile 2238\item Compiler-Fehler in Zeile 3239\item Eine \myCode{ClassCastException} tritt in Zeile 3 auf240\end{itemize}241\onslide<2>242\begin{itemize}243\item Sowohl \myCode{Apple} als auch \myCode{Orange} sind244\myCode{Fruit} und können in \myCode{Basket<Fruit>}245landen246\item[$\rightarrow$] Der Cast in Zeile 3 ist nötig247\item Die JVN überprüft während der Laufzeit den Cast in Zeile 3248\item[$\rightarrow$] Ein \myCode{ClassCastException} wird geworfen, da \myCode{Apple} keine \myCode{Orange} ist249\end{itemize}250\end{overprint}251\end{frame}252253\begin{frame}{Quiz}254\begin{block}{Frage}255Welche der folgenden Zeilen kann ohne Compiler-Fehler kompilieren?256\inputminted[linenos=true, numbersep=5pt, tabsize=4, fontsize=\tiny]{java}{Question04.java}257\end{block}258259\visible<2>{260\begin{itemize}261\item Generische Klassen können ohne spezifizierten Typ genutzt werden.262Allerdings sollte man das nicht machen und Eclipse warnt auch davor.263\item Korrekt sind: 1, 2, 3, 6264\item Grundsätzlich gilt: Rechts vom \myCode{=} darf man genauer sein als links265\end{itemize}266}267\end{frame}268269\begin{frame}{Quiz}270\begin{block}{Frage}271\begin{minipage}[b]{0.45\linewidth}272\inputminted[linenos=true, numbersep=5pt, tabsize=4, fontsize=\tiny, label=SourceA.java, frame=lines]{java}{SourceA.java}273\inputminted[linenos=true, numbersep=5pt, tabsize=4, fontsize=\tiny, label=SourceB.java, frame=lines]{java}{SourceB.java}274\end{minipage}275\hspace{0.5cm}276\begin{minipage}[b]{0.45\linewidth}277\inputminted[linenos=true, numbersep=5pt, tabsize=4, fontsize=\tiny, label=SourceC.java, frame=lines]{java}{SourceC.java}278Which of the following statements are true?279\end{minipage}280\end{block}281282\begin{overprint}283\onslide<1>284\begin{enumerate}[(a)]285\item SourceA kompiliert nicht286\item SourceB kompiliert mit warning(s). Es gibt keine287Laufzeit-Fehler288\item SourceC kompiliert mit warning(s). Es gibt eine289\myCode{ClassCastException} zur Laufzeit290\end{enumerate}291\onslide<2>292\begin{itemize}293\item (a) und (b) sind richtig.294\item Der Compiler kennt nicht den Typ von Elementen in b5295\item[$\rightarrow$] Er kann nicht garantieren, dass ein296Apfel in b5 eingefügt werden kann297\item Da \myCode{b5.setElement(..)} nicht erlaubt ist, kompiliert es nicht298\item SourceB wird so behandelt, als ob es pre-Java 1.5 Code wäre299\end{itemize}300\end{overprint}301\end{frame}302303\begin{frame}{Frage}304Sollen wir die restlichen 9 Fragen auf \href{http://www.grayman.de/quiz/java-generics-en.quiz}{grayman.de} machen?305\end{frame}306307\section{Einschub: Libraries}308\subsection{Warum heißen Bibliotheken so?}309\begin{frame}{Einschub: Libaries}310Warum heißen Programmbibliotheken "`Bibliotheken"'?311312313$\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}314\end{frame}315316\section{Abspann}317\subsection{Kommende Tutorien}318\begin{frame}{Kommende Tutorien}319\begin{itemize}320\item[-] 24.12.2012: Heiligabend - \href{http://www.fmc.uni-karlsruhe.de/faq/wann-sind-die-weihnachtsferien}{Kein Tutorium}321\item[-] 31.12.2012: Silvester - Kein Tutorium322\item[4.] 07.01.2013323\item[3.] 14.01.2013324\item[2.] 21.01.2013325\item[1.] 28.01.2013: Abschlussprüfunsvorbereitung326\item[0.] 04.02.2013: Abschlussprüfunsvorbereitung327\item[-] 10.02.2013: Ende der Vorlesungszeit des WS 2012/2013 (\href{http://www.kit.edu/studieren/2873.php}{Quelle})328\end{itemize}329\end{frame}330331\framedgraphic{Frohe Weihnachten!}{../images/xkcd-incident.png}332333\end{document}334335336