mirror of
https://github.com/MartinThoma/LaTeX-examples.git
synced 2025-04-26 06:48:04 +02:00
334 lines
13 KiB
TeX
334 lines
13 KiB
TeX
\documentclass[usepdftitle=false,hyperref={pdfpagelabels=false}]{beamer}
|
|
\usepackage{../templates/myStyle}
|
|
|
|
\begin{document}
|
|
\title{\titleText}
|
|
\subtitle{Polymorphismus, Generics, Libraries}
|
|
\author{\tutor}
|
|
\date{\today}
|
|
\subject{Programmieren}
|
|
|
|
\frame{\titlepage}
|
|
|
|
\frame{
|
|
\frametitle{Inhaltsverzeichnis}
|
|
\setcounter{tocdepth}{1}
|
|
\tableofcontents
|
|
\setcounter{tocdepth}{2}
|
|
}
|
|
|
|
%\AtBeginSection[]{
|
|
% \InsertToC[sections={\thesection}] % shows only subsubsections of one subsection
|
|
%}
|
|
|
|
\section{Einleitung}
|
|
\subsection{Quiz}
|
|
\begin{frame}{Quiz: Vererbung II}
|
|
\begin{minipage}[b]{0.45\linewidth}
|
|
\inputminted[linenos=false, numbersep=5pt, tabsize=4, fontsize=\tiny, label=Animal.java, frame=lines]{java}{Animal.java}
|
|
\vspace{1cm}
|
|
\inputminted[linenos=false, numbersep=5pt, tabsize=4, fontsize=\tiny, label=Jungle.java, frame=lines]{java}{Jungle.java}
|
|
\end{minipage}
|
|
\hspace{0.5cm}
|
|
\begin{minipage}[b]{0.45\linewidth}
|
|
\inputminted[linenos=false, numbersep=5pt, tabsize=4, fontsize=\tiny, label=Cat.java, frame=lines]{java}{Cat.java}
|
|
\begin{itemize}
|
|
\item Gibt es einen Compiler-Fehler?
|
|
\item Gibt es einen Laufzeit-Fehler?
|
|
\item Gibt es eine Ausgabe? Welche?
|
|
\end{itemize}
|
|
\end{minipage}
|
|
\end{frame}
|
|
|
|
\begin{frame}{Quiz: Antwort}
|
|
\begin{minipage}[b]{0.45\linewidth}
|
|
\inputminted[linenos=false, numbersep=5pt, tabsize=4, fontsize=\tiny, label=Animal.java, frame=lines]{java}{Animal.java}
|
|
\vspace{1cm}
|
|
\inputminted[linenos=false, numbersep=5pt, tabsize=4, fontsize=\tiny, label=Jungle.java, frame=lines]{java}{Jungle.java}
|
|
\end{minipage}
|
|
\hspace{0.5cm}
|
|
\begin{minipage}[b]{0.45\linewidth}
|
|
\inputminted[linenos=false, numbersep=5pt, tabsize=4, fontsize=\tiny, label=Cat.java, frame=lines]{java}{Cat.java}
|
|
\begin{itemize}
|
|
\item Compiler-Fehler
|
|
\item The method getCatSound() is undefined for the type Animal
|
|
\item Thema: "`Polymorphismus"'
|
|
\end{itemize}
|
|
\end{minipage}
|
|
\end{frame}
|
|
|
|
\section{Polymorphismus}
|
|
\subsection{Allgemeines}
|
|
\begin{frame}{Allgemeines}
|
|
Motivation
|
|
\begin{itemize}
|
|
\item Eine Unterklasse kann alles, was die Oberklasse kann
|
|
\item[$\rightarrow$] sie hat die gleichen Methoden, wenn auch eventuell überschrieben
|
|
\item Eventuell ist uns die konkrete Klasse egal
|
|
\item oder wir benötigen einen Kontainter für viele verschiedene
|
|
Objekte mit einer gemeinsamen Oberklasse
|
|
\end{itemize}
|
|
|
|
Was ist "`Polymorphismus'"?
|
|
\begin{itemize}
|
|
\item \myCode{Animal felix = new Cat();}
|
|
\item \myCode{Animal[] zoo = new Animal[10];}\\
|
|
\myCode{zoo[0] = felix;}
|
|
\end{itemize}
|
|
\end{frame}
|
|
|
|
\subsection{Beispiel}
|
|
\begin{frame}{Beispiel}
|
|
\inputminted[linenos=true, numbersep=5pt, tabsize=4, fontsize=\small]{java}{LateBinding.java}
|
|
\end{frame}
|
|
|
|
\subsection{Wann wird Polymorphismus verwendet?}
|
|
\begin{frame}{Wann wird Polymorphismus verwendet?}
|
|
\begin{itemize}[<+->]
|
|
\item Man Benötigt eigentlich nur bestimmte Methoden (ein Interface)
|
|
\begin{itemize}[<+->]
|
|
\item Wenn ihr später aus einer LinkedList eine ArrayList macht, müsst ihr nur eine Zeile ändern!
|
|
\item[$\Rightarrow$] \myCode{List myList = new LinkedList();} anstelle von \myCode{LinkedList myList = new LinkedList();} schreiben
|
|
\end{itemize}
|
|
\item Man weiß zur Compile-Zeit die exakten Klassen noch nicht
|
|
\item Bei den Abschlussaufgaben
|
|
\end{itemize}
|
|
\end{frame}
|
|
|
|
\section{Generics}
|
|
\subsection{Allgemeines}
|
|
\begin{frame}{Allgemeines}
|
|
\begin{itemize}
|
|
\item Problem: Man schreibt genau eine verkettete Listen-Klasse
|
|
für genau eine Klasse (z.B. "`Bike"'), obwohl
|
|
die Logik (hinzufügen, entfernen, suchen) von der
|
|
Klasse unabhängig ist
|
|
\item Lösung: Generics
|
|
\end{itemize}
|
|
\end{frame}
|
|
|
|
\subsection{Verwendung}
|
|
\begin{frame}{Verwendung}
|
|
\inputminted[linenos=true, numbersep=5pt, tabsize=4, fontsize=\small]{java}{Generics-singleLines.java}
|
|
\begin{block}{Hinweis}
|
|
Ihr könnt den "`Generic-Parameter"' wie eine Variable für die
|
|
Bezeichnung einer Klasse verwenden.
|
|
\end{block}
|
|
\end{frame}
|
|
|
|
\subsection{Praxis}
|
|
\begin{frame}{Praxis}
|
|
\begin{block}{Arbeitsauftrag}
|
|
Programmiert die Einfach-verkettete Liste um, sodass sie
|
|
nirgends mehr "`Bike"' sondern nur noch Generics verwendet.
|
|
\end{block}{Arbeitsauftrag}
|
|
|
|
\begin{exampleblock}{Hinweis}
|
|
\begin{itemize}
|
|
\item URL für die Bike-Version: \href{http://goo.gl/RoiBC}{http://goo.gl/RoiBC}
|
|
\item Wer nur Zettel und Papier hat, implementiert die "`Node.java"'
|
|
komplett neu und "`SinglyLinkedList.java"' mindestens mit "`add()"'
|
|
\end{itemize}
|
|
\end{exampleblock}
|
|
\end{frame}
|
|
|
|
\begin{frame}{Praxis: Node}
|
|
\inputminted[linenos=true, numbersep=5pt, tabsize=4, fontsize=\tiny]{java}{SinglyLinkedList-Result/Node.java}
|
|
\end{frame}
|
|
|
|
\begin{frame}{Praxis: SinglyLinkedList}
|
|
\inputminted[linenos=true, numbersep=5pt, tabsize=4, fontsize=\small, firstnumber=1, firstline=1, lastline=13]{java}{SinglyLinkedList-Result/SinglyLinkedList.java}
|
|
\end{frame}
|
|
|
|
\subsection{Blog-Artikel}
|
|
\begin{frame}{Man kanns auch übertreiben}
|
|
Siehe Blog-Artikel "`\href{http://martin-thoma.com/java-generics/}{Java Generics}"'
|
|
\end{frame}
|
|
|
|
\subsection{Besonderheit}
|
|
\begin{frame}{Besonderheit: ?}
|
|
\inputminted[linenos=false, numbersep=5pt, tabsize=4, fontsize=\small, firstnumber=1, firstline=1, lastline=1]{java}{SingleLines.java}
|
|
Bedeutet:
|
|
\begin{itemize}[<+->]
|
|
\item Die Liste erwartet Objekte, deren Klasse \myCode{HasWord} erweitern
|
|
\item[$\rightarrow$] \myCode{HasWord} oder Kinder
|
|
\item \myCode{?} wird "`bounded wildcard"' genannt
|
|
\item \href{http://stackoverflow.com/a/3009779/562769}{SO 1} und \href{http://stackoverflow.com/a/1840022/562769}{SO 2}
|
|
\end{itemize}
|
|
\end{frame}
|
|
|
|
\subsection{Quiz}
|
|
\begin{frame}{Quiz}
|
|
\begin{block}{Hinweis}
|
|
Das folgende Quiz stammt von \href{http://www.grayman.de/quiz/java-generics-en.quiz}{www.grayman.de}.
|
|
Danke für die Erlaubnis, es in meine Folien einbinden zu
|
|
dürfen!
|
|
\end{block}
|
|
\end{frame}
|
|
|
|
\begin{frame}{Quiz}
|
|
\begin{block}{Frage}
|
|
Mit Generics hat der Compiler mehr Typ-Informationen. Explizite
|
|
Casts müssen als nicht so of benutzt werden.
|
|
|
|
Welche Bedeutung für die Laufzeit haben Generics?
|
|
\end{block}
|
|
|
|
\begin{overprint}
|
|
\onslide<1>
|
|
\begin{itemize}
|
|
\item Der Compiler kann mit Generics den Code besser für
|
|
Typen optimieren. Das, und das Wegfallen der Casts sind
|
|
Gründe warum der kompilierte Code mit Generics
|
|
\textbf{schneller} läuft als ohne
|
|
\item Generics haben \textbf{keinen Einfluss} auf die Laufzeit
|
|
\item Die erhöhte Flexibilität und Typsicherheit bedeutet,
|
|
dass der Compiler für jeden konkreten Typen Code aus
|
|
dem generischen Code erstellen mus. Das bedeutet,
|
|
die Programme sind \textbf{etwas langsamer}
|
|
\end{itemize}
|
|
\onslide<2>
|
|
Die Java Virtual Machine und der kompilierte Byte-Code sind
|
|
unabhängig von Generics. Der kompilierte Byte-Code mit Generics
|
|
unterscheidet sich nicht von Byte-Code ohne Generics. Generics
|
|
haben also \textbf{keinen Einfluss} auf die Laufzeit von Java-Programmen.
|
|
\end{overprint}
|
|
\end{frame}
|
|
|
|
\begin{frame}{Quiz}
|
|
\begin{block}{Frage}
|
|
\begin{minipage}[b]{0.45\linewidth}
|
|
\inputminted[linenos=false, numbersep=5pt, tabsize=4, fontsize=\tiny]{java}{Basket.java}
|
|
\end{minipage}
|
|
\hspace{0.5cm}
|
|
\begin{minipage}[b]{0.45\linewidth}
|
|
\inputminted[linenos=false, numbersep=5pt, tabsize=4, fontsize=\tiny,]{java}{Fruit.java}
|
|
\inputminted[linenos=true, numbersep=5pt, tabsize=4, fontsize=\tiny, label=In main, frame=lines]{java}{Generics-quiz-main.java}
|
|
\end{minipage}
|
|
\end{block}
|
|
|
|
\begin{overprint}
|
|
\onslide<1>
|
|
\begin{itemize}
|
|
\item Der source code ist OK. Es gibt weder Compiler-, noch Laufzeitfehler
|
|
\item Compiler-Fehler in Zeile 2
|
|
\item Compiler-Fehler in Zeile 3
|
|
\end{itemize}
|
|
\onslide<2>
|
|
\begin{itemize}
|
|
\item Zeile 2 ist ok
|
|
\item Zeile 3 verursacht einen Laufzeitfehler
|
|
\item Der Rückgabewert der Methode \myCode{getElement}
|
|
in \myCode{Basket<Fruit>} ist \myCode{Fruit}.
|
|
Man kann eine \myCode{Fruit}-Variable
|
|
keiner \myCode{Apple}-Variable ohne cast zuweisen.
|
|
\end{itemize}
|
|
\end{overprint}
|
|
\end{frame}
|
|
|
|
\begin{frame}{Quiz}
|
|
\begin{block}{Frage}
|
|
\inputminted[linenos=true, numbersep=5pt, tabsize=4, fontsize=\tiny, label=In main, frame=lines]{java}{Generics-quiz-main2.java}
|
|
\end{block}
|
|
|
|
\begin{overprint}
|
|
\onslide<1>
|
|
\begin{itemize}
|
|
\item Es gibt weder Laufzeit-, noch Compiler-Fehler
|
|
\item Compiler-Fehler in Zeile 2
|
|
\item Compiler-Fehler in Zeile 3
|
|
\item Eine \myCode{ClassCastException} tritt in Zeile 3 auf
|
|
\end{itemize}
|
|
\onslide<2>
|
|
\begin{itemize}
|
|
\item Sowohl \myCode{Apple} als auch \myCode{Orange} sind
|
|
\myCode{Fruit} und können in \myCode{Basket<Fruit>}
|
|
landen
|
|
\item[$\rightarrow$] Der Cast in Zeile 3 ist nötig
|
|
\item Die JVN überprüft während der Laufzeit den Cast in Zeile 3
|
|
\item[$\rightarrow$] Ein \myCode{ClassCastException} wird geworfen, da \myCode{Apple} keine \myCode{Orange} ist
|
|
\end{itemize}
|
|
\end{overprint}
|
|
\end{frame}
|
|
|
|
\begin{frame}{Quiz}
|
|
\begin{block}{Frage}
|
|
Welche der folgenden Zeilen kann ohne Compiler-Fehler kompilieren?
|
|
\inputminted[linenos=true, numbersep=5pt, tabsize=4, fontsize=\tiny]{java}{Question04.java}
|
|
\end{block}
|
|
|
|
\visible<2>{
|
|
\begin{itemize}
|
|
\item Generische Klassen können ohne spezifizierten Typ genutzt werden.
|
|
Allerdings sollte man das nicht machen und Eclipse warnt auch davor.
|
|
\item Korrekt sind: 1, 2, 3, 6
|
|
\item Grundsätzlich gilt: Rechts vom \myCode{=} darf man genauer sein als links
|
|
\end{itemize}
|
|
}
|
|
\end{frame}
|
|
|
|
\begin{frame}{Quiz}
|
|
\begin{block}{Frage}
|
|
\begin{minipage}[b]{0.45\linewidth}
|
|
\inputminted[linenos=true, numbersep=5pt, tabsize=4, fontsize=\tiny, label=SourceA.java, frame=lines]{java}{SourceA.java}
|
|
\inputminted[linenos=true, numbersep=5pt, tabsize=4, fontsize=\tiny, label=SourceB.java, frame=lines]{java}{SourceB.java}
|
|
\end{minipage}
|
|
\hspace{0.5cm}
|
|
\begin{minipage}[b]{0.45\linewidth}
|
|
\inputminted[linenos=true, numbersep=5pt, tabsize=4, fontsize=\tiny, label=SourceC.java, frame=lines]{java}{SourceC.java}
|
|
Which of the following statements are true?
|
|
\end{minipage}
|
|
\end{block}
|
|
|
|
\begin{overprint}
|
|
\onslide<1>
|
|
\begin{enumerate}[(a)]
|
|
\item SourceA kompiliert nicht
|
|
\item SourceB kompiliert mit warning(s). Es gibt keine
|
|
Laufzeit-Fehler
|
|
\item SourceC kompiliert mit warning(s). Es gibt eine
|
|
\myCode{ClassCastException} zur Laufzeit
|
|
\end{enumerate}
|
|
\onslide<2>
|
|
\begin{itemize}
|
|
\item (a) und (b) sind richtig.
|
|
\item Der Compiler kennt nicht den Typ von Elementen in b5
|
|
\item[$\rightarrow$] Er kann nicht garantieren, dass ein
|
|
Apfel in b5 eingefügt werden kann
|
|
\item Da \myCode{b5.setElement(..)} nicht erlaubt ist, kompiliert es nicht
|
|
\item SourceB wird so behandelt, als ob es pre-Java 1.5 Code wäre
|
|
\end{itemize}
|
|
\end{overprint}
|
|
\end{frame}
|
|
|
|
\begin{frame}{Frage}
|
|
Sollen wir die restlichen 9 Fragen auf \href{http://www.grayman.de/quiz/java-generics-en.quiz}{grayman.de} machen?
|
|
\end{frame}
|
|
|
|
\section{Einschub: Libraries}
|
|
\subsection{Warum heißen Bibliotheken so?}
|
|
\begin{frame}{Einschub: Libaries}
|
|
Warum heißen Programmbibliotheken "`Bibliotheken"'?
|
|
|
|
|
|
$\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}
|
|
\end{frame}
|
|
|
|
\section{Abspann}
|
|
\subsection{Kommende Tutorien}
|
|
\begin{frame}{Kommende Tutorien}
|
|
\begin{itemize}
|
|
\item[-] 24.12.2012: Heiligabend - \href{http://www.fmc.uni-karlsruhe.de/faq/wann-sind-die-weihnachtsferien}{Kein Tutorium}
|
|
\item[-] 31.12.2012: Silvester - Kein Tutorium
|
|
\item[4.] 07.01.2013
|
|
\item[3.] 14.01.2013
|
|
\item[2.] 21.01.2013
|
|
\item[1.] 28.01.2013: Abschlussprüfunsvorbereitung
|
|
\item[0.] 04.02.2013: Abschlussprüfunsvorbereitung
|
|
\item[-] 10.02.2013: Ende der Vorlesungszeit des WS 2012/2013 (\href{http://www.kit.edu/studieren/2873.php}{Quelle})
|
|
\end{itemize}
|
|
\end{frame}
|
|
|
|
\framedgraphic{Frohe Weihnachten!}{../images/xkcd-incident.png}
|
|
|
|
\end{document}
|