📚 The CoCalc Library - books, templates and other resources
cocalc-examples / martinthoma-latex-examples / presentations / Programmieren-Tutorium / Tutorium-12 / tutorium-12.tex
132940 viewsLicense: OTHER
\documentclass[usepdftitle=false,hyperref={pdfpagelabels=false}]{beamer}1\usepackage{../templates/myStyle}23\begin{document}4\title{\titleText}5\subtitle{Überladung, Bindung, List, Dictionarys}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}26\inputminted[linenos=true, numbersep=5pt, tabsize=4, fontsize=\tiny,frame=lines,label=Main.java]{java}{QuizMain.java}27\inputminted[linenos=true, numbersep=5pt, tabsize=4, fontsize=\tiny]{java}{CrazyDataStructure.java}28\inputminted[linenos=true, numbersep=5pt, tabsize=4, fontsize=\tiny]{java}{ListLike.java}29\inputminted[linenos=true, numbersep=5pt, tabsize=4, fontsize=\tiny]{java}{ArrayListLike.java}30\begin{itemize}31\item Gibt es einen Compiler-Fehler?32\item Gibt es einen Laufzeit-Fehler?33\item Alles klappt34\end{itemize}35\end{frame}3637\begin{frame}{Quiz: Antwort}38\begin{block}{Antwort}39Alles klappt. Da ArrayListLike von ListLike erbt, erbt die40Klasse natürlich auch die Methoden. Insbesondere erbt sie41die Methoden, die CrazyDataStructure erwartet. Also42implementiert auch ArrayListLike das Interface ListLike,43obwohl es nicht explizit dort steht.44\end{block}45\end{frame}4647\section{Überladung}48\subsection{Musterlösung}49\begin{frame}{Musterlösung}50Eine Musterlösung zu Blatt 5 ist51\href{https://github.com/MartinThoma/prog-ws1213/tree/master/Blatt-05/tutor-solution/Blatt5/src/mediabib}{hier}.52\end{frame}5354\begin{frame}{Überladung}55\begin{exampleblock}{Allgemein}56\begin{enumerate}[<+->]57\item \myCode{void myFunction(int a);} und \myCode{void myFunction();}58\item \myCode{int myFunction();} und \myCode{double myFunction();}59\begin{itemize}60\item Geht in Java nicht61\item Funktioniert aber in Perl und Haskell (\href{http://stackoverflow.com/a/442291/562769}{Quelle})62\end{itemize}63\item \myCode{void myFunction();} und \myCode{int myFunction(int a);}64\item \myCode{void myFunction(String a);} und \myCode{void myFunction(int a);}65\item \myCode{void myFunction(String a);} und \myCode{void myFunction(int a, int b);}66\item \myCode{void myFunction(String a, int b);} und \myCode{void myFunction(int b, String a);}67\end{enumerate}68\end{exampleblock}69\end{frame}7071\begin{frame}{Überladung}72So was geht nicht:73\begin{itemize}[<+->]74\item \myCode{void myFunction(int a, int b);} und \myCode{void myFunction(int b, int a);}75\item \myCode{void myFunction(String a, int b);} und \myCode{void myFunction(String b, int a);}76\item[$\Rightarrow$] Für den Compiler ist der Bezeichner "`a"' bzw. "`b"' in der Signatur egal\\77Dort sind nur der Rückgabewert, der Name der Methode und die Parameter-Typen und deren Reihenfolge wichtig\\78In Java nicht mal der Rückgabewert79\end{itemize}80\end{frame}8182\begin{frame}{Überladung}83\begin{block}{\href{http://docs.oracle.com/javase/specs/jls/se7/jls7.pdf}{Java Language Specification}, 8.4.2}84Two methods have the same signature if they have the same name and argument types.85\end{block}8687Beispiele:88\begin{itemize}89\item \href{http://docs.oracle.com/javase/7/docs/api/java/lang/Math.html\#signum(double)}{Math.signum(double)},90\href{http://docs.oracle.com/javase/7/docs/api/java/lang/Math.html\#signum(float)}{Math.signum(float)}91\item PrintStream:92\href{http://docs.oracle.com/javase/7/docs/api/java/io/PrintStream.html\#println()}{println();},93\href{http://docs.oracle.com/javase/7/docs/api/java/io/PrintStream.html\#println(boolean)}{println(boolean);},94\href{http://docs.oracle.com/javase/7/docs/api/java/io/PrintStream.html\#println(char)}{println(char);} \dots95\item Interface List:96\href{http://docs.oracle.com/javase/7/docs/api/java/util/List.html\#toArray()}{Object[] toArray();},97\href{http://docs.oracle.com/javase/7/docs/api/java/util/List.html\#toArray(T[])}{<T> T[] toArray(T[] a)}98\end{itemize}99\end{frame}100101\section{Bindung}102\subsection{Allgemeines}103\framedgraphic{Bindung}{Bindung.png}104105\begin{frame}{"`Early Binding"' und "`Late Binding"'}106Bindung kann für jeweils ein Objekt zu zwei Zeitpunkten stattfinden:107\begin{block}{Early binding, static binding, compile-time-binding}108References are resolved at compile time:109\inputminted[linenos=false, numbersep=5pt, tabsize=4, fontsize=\small, firstline=5, lastline=7]{java}{singleLines.java}110\end{block}111112\begin{block}{Late binding, dynamic binding, run-time-binding}113References are resolved at run time:114\inputminted[linenos=false, numbersep=5pt, tabsize=4, fontsize=\small, firstline=9, lastline=13]{java}{singleLines.java}115\end{block}116{\tiny Quelle: \href{http://stackoverflow.com/a/640990/562769}{StackOverflow}}117\end{frame}118119\begin{frame}{Weitere}120\begin{itemize}121\item \href{http://en.wikipedia.org/wiki/Loose_coupling}{Loose coupling} (Lose Kopplung)122\item Loose binding - nicht weit verbreitet, vermutlich falscher Begriff123\item \href{http://en.wikipedia.org/wiki/Dynamic_dispatch}{Dynamic dispatch}:124Laut Wikipedia das gleiche wie "`dynamic binding"'.125\end{itemize}126\end{frame}127128\begin{frame}{"`Dynamic Binding"' und "`Dynamic dispatch"'}129\begin{itemize}130\item \href{http://en.wikipedia.org/wiki/Dynamic_dispatch\#Single_and_multiple_dispatch}{Single and multiple dispatch} - Java unterstützt nur single dispatch131\item \href{http://stackoverflow.com/questions/533330/dynamic-dispatch-and-binding}{Are dynamic dispatch and dynamic binding the same thing?} - No.132\item Aber: Late binding and dynamic single dispatch are, for all intents and purposes, the same. (\href{http://stackoverflow.com/a/9470993/562769}{Quelle})133\item Paper "`\href{http://homepages.mcs.vuw.ac.nz/~alex/files/MuscheviciPotaninTemperoNobleOOPSLA2008.pdf}{Multiple Dispatch in Practice}"'134\end{itemize}135\end{frame}136137\section{Nachbesprechung}138\subsection{Polymorphismus nutzen}139\begin{frame}{Polymorphismus}140\begin{itemize}141\item Was ihr schreibt:142\inputminted[linenos=false, numbersep=5pt, tabsize=4, fontsize=\small, firstline=1, lastline=1]{java}{singleLines.java}143\item Besser wäre:144\inputminted[linenos=false, numbersep=5pt, tabsize=4, fontsize=\small, firstline=2, lastline=2]{java}{singleLines.java}145\item Nicht vergessen:146\inputminted[linenos=false, numbersep=5pt, tabsize=4, fontsize=\small, firstline=3, lastline=3]{java}{singleLines.java}147\end{itemize}148149Warum ist Polymorphismus toll?150\begin{itemize}151\item siehe \href{http://www.artima.com/objectsandjava/webuscript/PolymorphismInterfaces1.html}{Polymorphism and Interfaces}152\item siehe 9. Tutorium153\end{itemize}154\end{frame}155156\subsection{Interne Comparatoren}157\begin{frame}{Interne Comparatoren}158\inputminted[linenos=true, numbersep=5pt, tabsize=4, fontsize=\tiny]{java}{InternalComparator.java}159{\tiny \href{http://martin-thoma.com/how-to-sort-with-java/\#Internal_anonymous_Comparator}{Quelle}}160\end{frame}161162\subsection{switch und String}163\begin{frame}{switch und String}164\begin{itemize}[<+->]165\item Erst mit Java SE 7 kann man \myCode{switch} auf eine Variable vom Typ \myCode{String} anwenden166\item \dots 16 Jahre nach dem Feature Request! (\href{http://bugs.sun.com/bugdatabase/view_bug.do?bug_id=1223179}{Quelle})167\item Vorher: \myCode{Cannot switch on a value of type String.}\\168\myCode{Only int values or enum constants are permitted}169\item Problem: Strings sind Objekte170\item Java-Puzzle: \myCode{new String("{}abc") != "{}abc";}171\item Java verwendet \myCode{.equals()} (\href{http://docs.oracle.com/javase/tutorial/java/nutsandbolts/switch.html}{Quelle})172\item \href{http://stackoverflow.com/a/338230/562769}{Mehr infos}173\end{itemize}174\end{frame}175176\begin{frame}{switch und String}177Früher hat man einen Enum verwendet:178\inputminted[linenos=false, numbersep=5pt, tabsize=4, fontsize=\small]{java}{Switch.java}179\end{frame}180181\subsection{Annotationen}182\begin{frame}{Quiz}183\inputminted[linenos=true, numbersep=5pt, tabsize=4, fontsize=\tiny, frame=lines, label=Person.java]{java}{PersonQuiz.java}184\inputminted[linenos=true, numbersep=5pt, tabsize=4, fontsize=\tiny]{java}{AnnotationQuiz.java}185\end{frame}186187\begin{frame}{Quiz: Antwort}188\begin{block}{Compiler-Fehler}189Exception in thread "main" java.lang.Error: \\190Unresolved compilation problem: \\191The method shout() of type Person must override or implement a supertype method\\192at Person.shout(Person.java:12)\\193at Main.main(Main.java:4)194\end{block}195\end{frame}196197\begin{frame}{@Override-Annotation}198Die Annotation \myCode{@Override} \dots199\begin{itemize}[<+->]200\item Sollte verwendet werden, damit der Compiler euch warnen201kann, wenn ihr nichts überschreibt202\item[$\Rightarrow$] Tippfehler werden unwahrscheinlicher203\item Anderen ist klar, dass euch klar war, dass ihr etwas204überschreibt205\item Code ist leichter verständlich206\end{itemize}207\end{frame}208209\begin{frame}{@author-Annotation}210\begin{itemize}211\item Für die Klausur bitte \myCode{@author} verwenden212\item und euren korrekten Namen angeben213\item In Eclipse: \menu{Window > Preferences > Java > Code Style > Code Templates > Comments > Types}214und dort \myCode{\$\{user\}} durch euren Namen ersetzen215\end{itemize}216\end{frame}217218\subsection{Aufbau einer Klasse}219\begin{frame}{Aufbau einer Klasse}220Folgender Aufbau ist Konvention und sollte eingehalten werden:221\begin{enumerate}222\item Class/interface documentation comment (/**...*/)223\item class or interface statement224\item Class/interface implementation comment (/*...*/), if necessary225\item Class (static) variables226\item \textbf{Instance variables}227\item \textbf{Constructors}228\item \textbf{Methods}229\end{enumerate}230Quelle: \href{http://www.oracle.com/technetwork/java/codeconventions-150003.pdf}{Oracle Coding Convetions}, 3.1.3231\end{frame}232233\section{Java API: List}234\subsection{Allgemeines}235\begin{frame}{Allgemeines}236Es gibt in \myCode{java.utils.*}237\begin{itemize}[<+->]238\item \href{http://docs.oracle.com/javase/7/docs/api/java/util/List.html}{Interface List<E>}239\begin{itemize}240\item \myCode{add(E e)}, \myCode{contains(Object o)}, \myCode{get(int index)}, \myCode{remove(Object o)}241\end{itemize}242243\item \href{http://docs.oracle.com/javase/7/docs/api/java/util/ArrayList.html}{Class ArrayList<E>}244\begin{itemize}245\item Stärken: get, add $\in \mathcal{O}(1)$ - add nur amortisiert!246\item Schwächen: remove $\in \mathcal{O}(n)$247\end{itemize}248249\item \href{http://docs.oracle.com/javase/7/docs/api/java/util/LinkedList.html}{Class LinkedList<E>}250\begin{itemize}251\item Stärken: add $\in \mathcal{O}(1)$252\item Schwächen: get, remove $\in \mathcal{O}(n)$, Speicherplatz253\end{itemize}254\item[$\Rightarrow$] LinkedList nur dann, wenn ihr add sehr häufig nutzt255\end{itemize}256257Siehe: \href{http://stackoverflow.com/q/322715/562769}{When to use LinkedList<> over ArrayList<>?}258\end{frame}259260\begin{frame}{List: Beispiel}261\inputminted[linenos=true, numbersep=5pt, tabsize=4, fontsize=\tiny]{java}{ListExample.java}262\end{frame}263264\begin{frame}{Ausgabe}265\begin{itemize}266\item myList: [41, 35, 9, 51, 35]267\item anotherList: [2, 51, 64, 58, 57]268\item combined: [2, 9, 35, 35, 41, 51, 51, 57, 58, 64]269\end{itemize}270\end{frame}271272\begin{frame}{ArrayList vs. Vector}273\begin{itemize}274\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 identisch275\item Einziger Unterschied: Vector ist synchronized276\item[$\Rightarrow$] In Single-Thread-Anwendungen immer ArrayList verwenden277\item[$\Rightarrow$] Für die Abschlussaufgabe auf keinen Fall Vektor verwenden278\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++})279\end{itemize}280\end{frame}281282\section{Dictionary}283\subsection{Allgemeines}284\begin{frame}{Allgemeines}285\begin{itemize}[<+->]286\item \href{http://docs.oracle.com/javase/7/docs/api/java/util/Dictionary.html}{Dictionary}287is obsolete. New implementations should implement the288\href{http://docs.oracle.com/javase/7/docs/api/java/util/Map.html}{Map}289interface, rather than extending Dictionary.290\item Telefonbuch-Anwendungsfälle291\begin{itemize}292\item Schlüssel wird auf Wert abgebildet293\item Beides sind Objekte294\item Schlüssel ist eindeutig, Wert darfs mehrfach geben (sowohl identisch als auch gleich sind ok)295\end{itemize}296\item Interface Map links vom \myCode{=}297\item \href{http://docs.oracle.com/javase/7/docs/api/java/util/HashMap.html}{HashMap}:298\begin{itemize}299\item makes no guarantees as to the order of the map300\item $\mathcal{O}(1)$ für \myCode{get} und \myCode{put}301\end{itemize}302\item \href{http://docs.oracle.com/javase/7/docs/api/java/util/TreeMap.html}{TreeMap}:303\begin{itemize}304\item sorted according to the natural ordering of its keys305\item $\mathcal{O}(\log n)$ für \myCode{containsKey}, \myCode{get}, \myCode{put} und \myCode{remove}306\end{itemize}307\item \href{http://docs.oracle.com/javase/7/docs/api/java/util/LinkedHashMap.html}{LinkedHashMap}:308\begin{itemize}309\item predictable iteration order (usually insertion-order)310\item $\mathcal{O}(1)$ für \myCode{add} und \myCode{remove}311\end{itemize}312\end{itemize}313\end{frame}314315\subsection{Beispiele}316\begin{frame}{Beispiel 1}317\inputminted[linenos=false, numbersep=5pt, tabsize=4, fontsize=\small]{java}{MapSimple.java}318http://stackoverflow.com/questions/2889777/difference-between-hashmap-linkedhashmap-and-sortedmap-in-java319\end{frame}320321\begin{frame}{Beispiel 2.1}322\inputminted[linenos=false, numbersep=5pt, tabsize=4, fontsize=\tiny, frame=lines,label=Person.java]{java}{Person.java}323\inputminted[linenos=false, numbersep=5pt, tabsize=4, fontsize=\tiny, frame=lines,label=TelephoneNumber.java]{java}{TelephoneNumber.java}324\end{frame}325326\begin{frame}{Beispiel 2.2}327\inputminted[linenos=true, numbersep=5pt, tabsize=4, fontsize=\small]{java}{MapSimple2.java}328\end{frame}329330\begin{frame}{Beispiel 2.3: Durch Map iterieren}331\inputminted[linenos=false, numbersep=5pt, tabsize=4, fontsize=\small, firstline=15, lastline=20]{java}{singleLines.java}332\end{frame}333334\section{Swing}335\subsection{Basics}336\begin{frame}{Basics: Ein Fenster}337\inputminted[linenos=false, numbersep=5pt, tabsize=4, fontsize=\tiny]{java}{Swing1.java}338\end{frame}339\framedgraphic{Basics: Ein Fenster}{java-swing-jpanel.png}340341\subsection{ActionListener}342\begin{frame}{ActionListener}343ActionLister sind \dots344\begin{itemize}[<+->]345\item ein weit verbreitetes Konzept346\item Objekte, die auf bestimmte Aktionen warten und347\begin{itemize}348\item dann was machen349\item die Aktion "`delegieren"'350\end{itemize}351\item das \href{http://docs.oracle.com/javase/7/docs/api/java/awt/event/ActionListener.html}{Interface ActionListener}352\end{itemize}353\end{frame}354355\begin{frame}{ActionListener}356\inputminted[linenos=false, numbersep=5pt, tabsize=4, fontsize=\tiny]{java}{Swing2.java}357{\tiny \href{http://martin-thoma.com/how-to-use-swing/}{complete source}}358\end{frame}359360361362\section{Abspann}363\subsection{Kommende Tutorien}364\begin{frame}{Kommende Tutorien: Themen?}365\begin{itemize}366\item \href{http://zetcode.com/tutorials/javagamestutorial/}{Snake}367\item Space Invaders368\item Breakout369\item Tetris370\item Minesweeper371\item Sokoban372\item Swing (Fenster in Java)373\item Port-Scanner374\item Multiprocessing (Matrix-Multiplikation auf mehreren Kernen)375\item Web-Crawler376\item PageRank auf reale Daten anwenden377\item Chat378\item[$\Rightarrow$] Bitte auf \href{http://www.doodle.com/drn5f9i94zedws5n}{Doodle} wählen!379\end{itemize}380\end{frame}381382\begin{frame}{Disclaimer}383Bei wem steht noch \dots384\begin{itemize}385\item Einverständniserklärung nicht im Praktomaten registriert386\item Prüfungsanmeldung nicht im Praktomaten registriert387\end{itemize}388\end{frame}389390\begin{frame}{Mathe-Studenten}391\begin{itemize}392\item Was der Prof. über den Verteilger geschrieben hat war Unfug.393\item Zulassungsbescheinigung über Studienbüro (blauer Schein)394\item Vermutlich kein Übungsschein395\item Nur für die Klausur396\end{itemize}397\end{frame}398399\begin{frame}{Kommende Tutorien}400\begin{itemize}401\item[2.] 21.01.2013402\item[1.] 28.01.2013: Abschlussprüfunsvorbereitung403\item[-] 28.01.2013: Ausgabetermin für Teil 1404\item[0.] 04.02.2013: Abschlussprüfunsvorbereitung405\item[-] 10.02.2013: Ende der Vorlesungszeit des WS 2012/2013 (\href{http://www.kit.edu/studieren/2873.php}{Quelle})406\end{itemize}407\end{frame}408409\framedgraphic{Vielen Dank für eure Aufmerksamkeit!}{../images/geekandpoke-2009-10-naming-conventions.jpg}410411\end{document}412413414