Add termin3
This commit is contained in:
parent
a698803b82
commit
667e7fabda
|
@ -0,0 +1,34 @@
|
||||||
|
<!--
|
||||||
|
title: Termin 3
|
||||||
|
description: Folien für den ersten Termin in Programmieren 2
|
||||||
|
url: https://git.haw-hamburg.de/pm2-tutorium/slides
|
||||||
|
header: Programmieren 2 **Tutorium**
|
||||||
|
footer: Henri Burau
|
||||||
|
-->
|
||||||
|
|
||||||
|
# Termin 3
|
||||||
|
|
||||||
|
---
|
||||||
|
|
||||||
|
# Fragen
|
||||||
|
|
||||||
|
---
|
||||||
|
|
||||||
|
# Links
|
||||||
|
[https://git.haw-hamburg.de/pm2-tutorium](https://git.haw-hamburg.de/pm2-tutorium)
|
||||||
|
- Aufgaben
|
||||||
|
- Tutoriumsfolien
|
||||||
|
|
||||||
|
---
|
||||||
|
|
||||||
|
# Plan für heute
|
||||||
|
|
||||||
|
Level 5 Themen:
|
||||||
|
|
||||||
|
- Testen und Asserts
|
||||||
|
- Polymorphie und Vererbung
|
||||||
|
- Generizität
|
||||||
|
- Reflections
|
||||||
|
- **Implementationsvererbung**
|
||||||
|
- **Exceptions**
|
||||||
|
- **Module**
|
|
@ -0,0 +1,99 @@
|
||||||
|
<!--
|
||||||
|
title: Abstrakte Klasse
|
||||||
|
description: Folien für abstrakte Klassen in Programmieren 2
|
||||||
|
url: https://git.haw-hamburg.de/pm2-tutorium/slides
|
||||||
|
header: Programmieren 2 **Tutorium**
|
||||||
|
footer: Henri Burau
|
||||||
|
-->
|
||||||
|
|
||||||
|
# Abstrakte Klassen
|
||||||
|
|
||||||
|
|
||||||
|
---
|
||||||
|
|
||||||
|
# Abstrakte Klassen
|
||||||
|
|
||||||
|
In abstrakten Klassen können Operationen **ohne** eine Implementation deklariert werden.
|
||||||
|
|
||||||
|
```java
|
||||||
|
abstract double gibFlaeche();
|
||||||
|
```
|
||||||
|
|
||||||
|
---
|
||||||
|
|
||||||
|
# Abstrakte Klassen
|
||||||
|
|
||||||
|
Eine Klasse mit mindestens einer abstrakten Methode muss abstrakt sein.
|
||||||
|
|
||||||
|
Es können keine Instanzen einer abstrakten Klasse erzeugt werden.
|
||||||
|
|
||||||
|
```java
|
||||||
|
abstract class Form
|
||||||
|
{
|
||||||
|
abstract double gibFlaeche();
|
||||||
|
|
||||||
|
String toString()
|
||||||
|
{
|
||||||
|
return "Form";
|
||||||
|
}
|
||||||
|
}
|
||||||
|
```
|
||||||
|
|
||||||
|
---
|
||||||
|
|
||||||
|
# Benutzung
|
||||||
|
|
||||||
|
Es können keine Instanzen einer abstrakten Klasse erzeugt werden. Trotzdem definieren die abstrakten Klassen einen Typ.
|
||||||
|
|
||||||
|
```java
|
||||||
|
// Deklaration
|
||||||
|
class Kreis extends Form {
|
||||||
|
private double _radius;
|
||||||
|
|
||||||
|
Circle(double rad) {radius = rad;}
|
||||||
|
|
||||||
|
double gibFlaeche(){
|
||||||
|
return 3.14 * radius * radius;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
// Benutzung
|
||||||
|
Form form1 = new Kreis(4.5);
|
||||||
|
```
|
||||||
|
|
||||||
|
---
|
||||||
|
|
||||||
|
# Verwendung
|
||||||
|
|
||||||
|
Abstrakte Klassen werden immer benutzt wenn Code wiederverwendet werden soll, aber nicht alle Details bekannt sind. Dabei wird häufig das Prinzip der Schablonen- und Einschubmethoden genutzt.
|
||||||
|
|
||||||
|
```java
|
||||||
|
abstract class DreidimensionaleForm {
|
||||||
|
private double _hoehe;
|
||||||
|
|
||||||
|
abstract double gibFlaeche();
|
||||||
|
|
||||||
|
double gibVolumen() {
|
||||||
|
return gibFlaeche() * _hoehe;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
```
|
||||||
|
|
||||||
|
* Welche Methode ist die Einschubmethode und welche die Schablonenmethode?
|
||||||
|
|
||||||
|
---
|
||||||
|
|
||||||
|
# Übung
|
||||||
|
|
||||||
|
1) Müssen alle abstrakten Methoden eine abstrakten Klasse in einer Subklasse implementiert werden?
|
||||||
|
* Ja, denn ansonsten fehlt für manche Operationen die Implementation.
|
||||||
|
|
||||||
|
2) Sind alle Felder der abstrakten Klasse auch in der Subklasse enthalten?
|
||||||
|
* Ja
|
||||||
|
|
||||||
|
3) Darf auf alle Felder der Superklasse aus der Subklasse zugegriffen werden?
|
||||||
|
* Nur solange die Modifier `private`, `protected` oder `package private` sind.
|
||||||
|
|
||||||
|
---
|
||||||
|
|
||||||
|
4) Ändere die Klasse `Animal` zu einer abstrakten Klasse. Alle Methoden die bei `Sheep` und `Cow` gleich sind müssen nicht abstrakt sein. Füge aber eine abstrakte Methode `String makeNoise()` ein. Ändere den Code and den richtigen Stellen ab.
|
|
@ -0,0 +1,87 @@
|
||||||
|
<!--
|
||||||
|
title: Assertions
|
||||||
|
description: Folien für Assertions in Programmieren 2
|
||||||
|
url: https://git.haw-hamburg.de/pm2-tutorium/slides
|
||||||
|
header: Programmieren 2 **Tutorium**
|
||||||
|
footer: Henri Burau
|
||||||
|
-->
|
||||||
|
|
||||||
|
# Exceptions
|
||||||
|
|
||||||
|
Erlauben es mit Fehlersituationen in einem Programm umzugehen. Es gibt zwei mögliche Fehlerarten:
|
||||||
|
|
||||||
|
1) **Entwicklungsfehler**
|
||||||
|
Vermeidbare Fehler die während der Entwicklung auftreten. Können gut durch Tests aufgedeckt werden und brauchen keine explizite Fehlerbehandlung.
|
||||||
|
*Beispiel*: Ungültiger Arrayindex, Teilen durch 0
|
||||||
|
|
||||||
|
2) **Umgebungsfehler**
|
||||||
|
Unvermeidbare Fehler die durch die Programmumgebung ausgelöst werden. Diese Fehlerart benötigt eine Fehlerbehandlung.
|
||||||
|
*Beispiel*: Keine Internetverbindung, Zu wenig Festplattenspeicher
|
||||||
|
|
||||||
|
---
|
||||||
|
|
||||||
|
# Hierarchie
|
||||||
|
|
||||||
|
Exceptions sind Objekte die von `Exception` oder `RuntimeException` erben.
|
||||||
|
|
||||||
|
[](https://mermaid-js.github.io/mermaid-live-editor/#/edit/eyJjb2RlIjoiY2xhc3NEaWFncmFtXG4gICAgVGhyb3dhYmxlIDx8LS0gRXhjZXB0aW9uXG4gICAgVGhyb3dhYmxlIDx8LS0gRXJyb3JcbiAgICBFeGNlcHRpb24gPHwtLSBSdW50aW1lRXhjZXB0aW9uIiwibWVybWFpZCI6eyJ0aGVtZSI6ImRlZmF1bHQifSwidXBkYXRlRWRpdG9yIjpmYWxzZX0)
|
||||||
|
|
||||||
|
---
|
||||||
|
|
||||||
|
# Ungeprüfte Exceptions
|
||||||
|
|
||||||
|
Erben von `RuntimeException` und müssen nicht explizit behandelt werden.
|
||||||
|
|
||||||
|
```java
|
||||||
|
Dreieck dreieck = null;
|
||||||
|
double flaeche = dreieck.gibFlaeche();
|
||||||
|
// Programm wird beendet mit NullPointerException
|
||||||
|
```
|
||||||
|
---
|
||||||
|
|
||||||
|
# Geprüfte Exceptions
|
||||||
|
|
||||||
|
Erben von `Exception` und müssen explizit behandelt werden.
|
||||||
|
|
||||||
|
```java
|
||||||
|
public static void main(String[] args) {
|
||||||
|
System.out.print("Bitte Alter eingeben: ");
|
||||||
|
try {
|
||||||
|
Scanner sc = new Scanner(System.in);
|
||||||
|
String name = sc.nextLine();
|
||||||
|
int alter = Integer.parseInt(name); // Wirft ggf. NumberFormatException
|
||||||
|
}
|
||||||
|
catch(NumberFormatException e) {
|
||||||
|
System.out.println("Das war kein gültiges Alter!");
|
||||||
|
}
|
||||||
|
finally {
|
||||||
|
sc.close()
|
||||||
|
}
|
||||||
|
}
|
||||||
|
```
|
||||||
|
---
|
||||||
|
|
||||||
|
# Exceptions werfen
|
||||||
|
|
||||||
|
Exceptions werden mit dem Schlüsselwort `throw` geworfen. Wird in einer Methode eine geprüfte Exception nicht behandelt, muss dies in dem Methodenkopf mithilfe von `throws` deklariert werden.
|
||||||
|
|
||||||
|
```java
|
||||||
|
public void pingServer(String serverUrl) throws ConnectException
|
||||||
|
{
|
||||||
|
Server server = connectToServer(serverUrl);
|
||||||
|
if(server == null)
|
||||||
|
{
|
||||||
|
throw new ConnectException("Can't connect to server");
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
```
|
||||||
|
|
||||||
|
---
|
||||||
|
# Übung
|
||||||
|
|
||||||
|
1) Wann werden geprüfte Exceptions eingesetzt und wann ungeprüfte?
|
||||||
|
* Geprüfte Exceptions bei Umgebungsfehlern, Ungeprüfte Exceptions bei Entwicklungsfehlern
|
||||||
|
|
||||||
|
2) Wie kann eine geprüfte Exception beim Auftreten an den Klienten weitergeleitet werden?
|
||||||
|
* In den Methodenkopf `throws` reinschreiben
|
|
@ -0,0 +1,91 @@
|
||||||
|
<!--
|
||||||
|
title: Termin 3
|
||||||
|
description: Folien für den ersten Termin in Programmieren 2
|
||||||
|
url: https://git.haw-hamburg.de/pm2-tutorium/slides
|
||||||
|
header: Programmieren 2 **Tutorium**
|
||||||
|
footer: Henri Burau
|
||||||
|
-->
|
||||||
|
|
||||||
|
# Module
|
||||||
|
|
||||||
|
Grundlegendes Konzept in der Programmierung zur Organisation von Programmcode.
|
||||||
|
|
||||||
|
Module kapseln Implementationen und exportieren eine Schnittstelle mit Operationen, Typen und Konstanten. Dies kann explizit durch die Java 9 Modules geschehen oder implizit durch Zugriffsmodifikatoren.
|
||||||
|
|
||||||
|
---
|
||||||
|
|
||||||
|
# Geschachtelte Klassen
|
||||||
|
|
||||||
|
Erlaubt das Verstecken von Hilfsklassen.
|
||||||
|
|
||||||
|
```java
|
||||||
|
class Dreieck {
|
||||||
|
private Koordinate _a;
|
||||||
|
private Koordinate _b;
|
||||||
|
private Koordinate _c;
|
||||||
|
|
||||||
|
private class Koordinate
|
||||||
|
{
|
||||||
|
...
|
||||||
|
}
|
||||||
|
}
|
||||||
|
```
|
||||||
|
|
||||||
|
---
|
||||||
|
|
||||||
|
# Pakete
|
||||||
|
|
||||||
|
Ermöglichen Namensräume von zusammengehörigen Klassen. Klassen und Interfaces sind nur sichtbar wenn sie mit dem Schlüsselwort `public` deklariert wurden.
|
||||||
|
|
||||||
|
```java
|
||||||
|
// Dreieck.java
|
||||||
|
package formen;
|
||||||
|
public class Dreieck {
|
||||||
|
private Koordinate _a;
|
||||||
|
private Koordinate _b;
|
||||||
|
private Koordinate _c;
|
||||||
|
//...
|
||||||
|
}
|
||||||
|
// Koordinate.java
|
||||||
|
package formen;
|
||||||
|
class Koordinate
|
||||||
|
{
|
||||||
|
//...
|
||||||
|
}
|
||||||
|
```
|
||||||
|
|
||||||
|
---
|
||||||
|
|
||||||
|
# Imports
|
||||||
|
|
||||||
|
Möchte man Klassen und Interfaces aus einem anderen Paket nutzen dann müssen diese importiert werden. Um eine Grundfunktionalität von Java zu gewährleisten wird das Paket [`java.lang`](https://docs.oracle.com/javase/8/docs/api/java/lang/package-summary.html) immer importiert.
|
||||||
|
|
||||||
|
```java
|
||||||
|
import java.util.List; // Nur List
|
||||||
|
import java.util.*; // Alle Klassen und Interfaces aus java.util
|
||||||
|
|
||||||
|
import static org.junit.Assert.*; // Statischer Import der Asserts
|
||||||
|
|
||||||
|
import java.lang.*; // Default Import der immer gemacht wird
|
||||||
|
```
|
||||||
|
|
||||||
|
---
|
||||||
|
|
||||||
|
# Sichtbarkeiten
|
||||||
|
|
||||||
|
Sichtbarkeiten von Methoden, Konstruktoren und Feldern:
|
||||||
|
|
||||||
|
* **public**: Sichtbar innerhalb und außerhalb des eigenen Pakets
|
||||||
|
* **protected**: Sichtbar innerhalb des Pakets und für erbende Klassen
|
||||||
|
* **package-private**: Sichtbar innerhalb des Pakets
|
||||||
|
* **private**: Nur sichtbar innerhalb der Klasse
|
||||||
|
|
||||||
|
---
|
||||||
|
|
||||||
|
# Übung
|
||||||
|
|
||||||
|
1) Durch welches Schlüsselwort wird der Modifikator `package-private` genutzt?
|
||||||
|
* Durch die Verwendung von keinem Schlüsselwort als Modifikator
|
||||||
|
|
||||||
|
2) Wie sollten Pakete benannt werden?
|
||||||
|
* Umgedrehte Domain: `de.henriburau.meineKlassen`
|
Loading…
Reference in New Issue