10th Java Lesson (Java Course @ TUD)

https://github.com/Trivo25/tud-java-course

January 6, 2022

Während Ihr darauf wartet, dass es beginnt..

Java

Objektorientierte Programmierung

Florian Kluge, Moritz Schulz

  1. January 2022

https://trivo25.github.io/tud-java-course/


Florian.Kluge@mailbox.tu-dresden.de

Moritz.Schulz2@mailbox.tu-dresden.de

Was wir heute machen

Objektorientierte Programmierung

  • type casts
  • instanceof
  • interfaces
  • Exceptions

Contact

Florian Kluge

Florian.Kluge@mailbox.tu-dresden.de

Moritz Schulz

Moritz.Schulz2@mailbox.tu-dresden.de

Kurze Info zum Kurs: online

  • bitte abmelden / entschuldigen, wenn ihr nicht kommt
    • zwei Mal in Folge unentschuldigt fehlen => ausgetragen
  • bitte, fragt gern, jederzeit
    • entweder Frage im Chat stellen
    • oder sich mit Handzeichen melden => nach dem Drannehmen per Mikro die Frage stellen
  • praktische Aufgaben- und Beispiel-basierte Lernweise
    • wenn ihr nicht weiterkommt / sich etwas komisch verhält:
      • “?” in den Chat schreiben
      • wir gehen mit dir in einen Breakout-Raum
      • du kannst dann den Bildschirm teilen
  • uns geht es darum, alle mitzunehmen

Stay up to date

  • die E-Mails der TUD regelmäßig überprüfen
    • z.B. Bekanntgabe der Veröffentlichung der Folien
      • auf der Seite des Programmierkurses

Los geht’s!

Wiederholung 1/2

  • am Beispiel der Aufgabe vom letzten Mal
  • Vererbung mit extends (“erbt von”)
  • subclass und superclass
    • im Beispiel: Student und Person
public class Student extends Person {
    //...
}

Vererbung und UML - Aufgabe

Type Casts

  • Umwandlung von Datentypen: mit runden Klammern
  • Java macht das automatisch, wenn die Umwandlung offensichtlich verlustfrei ist
int a = 2032;
float b = (float) a;
System.out.println(b); // 2032.0

instanceof

KlasseA obj = new KlasseA();

if (obj instanceof KlasseB) {
    // ...
}
  • Ermittelt, ob
    • obj von der Klasse KlasseB Instanz ist
    • die Klasse von obj (KlasseA) subclass von KlasseB ist

Verwendung: instanceof und Type Casts

  • Beispiel im Zusammenhang mit der Beispielaufgabe:
public static void besucheVorlesung(Person p) {
    if (p instanceof Dozent) {
        Dozent d = (Dozent) p;
        d.teach();
    } else if (p instanceof Student) {
        Student s = (Student) p;
        s.study();
    }
}
  • Umwandlung (Type Cast) ermöglicht Verwendung spezieller Methoden

Verwendung: instanceof und Type Casts

  • übrigens: p.teach() und p.study() würden nicht gehen, denn die Methoden sind in der Klasse Person nicht vorhanden
Instanceof.java:10: error: cannot find symbol
              p.teach();
               ^
symbol:   method teach()
location: variable p of type Person

Wiederholung 2/2

  • Overriding ist, wenn Methoden der subclass Methoden der superclass überschreiben
class Animal {
    public void makeSound() {
        System.out.println("some generic animal sound");
    }
}

class Pig extends Animal {
    @Override
    public void makeSound() {
        System.out.println("oiinkk");
    }
}


// zum Beispiel in main(String[] args):
    Animal pig1 = new Pig(); // pig1 kann auch vom Typ Animal sein
    pig1.makeSound(); // 'oiinkk' und nicht 'some generic animal sound'

Interfaces: Problemstellung

  • Wir nutzen die Klasse Animal, um vorzugeben, welche Methoden Animal-Objekte haben sollen
  • Was, wenn wir aber kein Standardverhalten haben wollen?
    • also "some generic animal sound" meiden wollen?
  • Wir wollen aber trotzdem sagen, dass ein Objekt gewisse Verhaltensweisen (Methoden) haben soll.
  • Dazu werden Interfaces genutzt.

Interfaces: Beispiel

interface Animal {
    public void makeSound();
}

class Pig implements Animal {
    @Override
    public void makeSound() {
        System.out.println("oiinkk");
    }
}


// zum Beispiel in main(String[] args):
    Animal pig1 = new Pig();
    pig1.makeSound(); // 'oiinkk'

Interfaces: Weitere Infos

  • Syntax:
    • deklarieren: interface Interface { /*...*/ }
      • Methoden haben keinen Körper (“abstrakt”)
      • nur Methoden, keine nicht-statischen Variablen
    • implementieren Klasse implements Interface
  • new Animal() würde im Beispiel nicht funktionieren
  • Interfaces werden gern mit I... benannt (z.B. IAnimal)
  • Weiterer Vorteil gegenüber Klassen:
    • eine Klasse kann nur von genau einer Klasse erben (extends)
    • eine Klasse kann aber beliebig viele Interfaces implementieren (implements)

Interfaces: Comparable<T>

  • von Java vordefiniert
  • T ist der Typ, also der Klassenname
  • eine Methode: int compareTo(T o)
  • a.compareTo(b) gibt zurück:
    • negative Ganzzahl: a kleiner als b
    • Null: a gleich groß wie b
    • positive Ganzzahl: a größer als b

https://docs.oracle.com/javase/8/docs/api/java/lang/Comparable.html

Aufgabe 1 zu Interfaces (Teil 1)

Arbeite hier gern mit mehreren Dateien.

  1. Deklariere ein Interface Form, das eine Methode float getFlaeche() fordert.
  2. Implementiere das Interface für 2 Klassen: Rechteck und Dreieck (Konstruktoren, implements, float getFlaeche())
  3. Teste, ob der Code wie gewünscht funktioniert, indem du jeweils zwei Rechtecke und zwei Dreiecke erstellst und deren Fläche in der Konsole ausgeben lässt: System.out.println(flaeche1);
  4. Überschreibe (@Override) die String toString()-Methode in den Klassen, und verwende sie, um auch das Objekt in der Konsole auszugeben

Aufgabe 1 zu Interfaces (Teil 2)

  1. Lasse die beiden Klassen Rechteck und Dreieck das Comparable<Form>-Interface implementieren. Vergleiche in der Methode int compareTo(Form f) die Flächen entsprechend.
  2. Lege einen Array Form[] formen von den vier Objekten an (= {r1,r2,d1,d2}).
  3. Wir brauchen die Arrays-Klasse für den nächsten Schritt: import java.util.Arrays;
  4. Gib formen aus, indem du Arrays.toString(formen) verwendest.
  5. Nutze Arrays.sort(formen), um das Array zu sortieren.
  6. Gib formen auch nach dem Sortiervorgang aus.

Optionale Aufgabe 2 zu Interfaces & Arrays

Setze eine Queue (Warteschlange) von int als Interface um.

Eine Queue ist ein abstrakter Datentyp nach FIFO-Prinzip: First in, first out. D.h. das Element, das zuerst hinzugefügt wird, wird auch zuerst herausgenommen.

Das Interface hat die Methoden

  • void push(int i): füge einen int hinten an
  • int pop(): entferne den letzten int und gib ihn zurück

Setze dies mit einem Array um. Sollte der Array irgendwann zu klein sein, um noch eine weitere Zahl zu halten, musst du einen neuen Array erstellen und zunächst alle Elemente kopieren.

Teste deine Implementierung mit kleinen und großen Queues.

See course materials here: https://trivo25.github.io/tud-java-course/

Check out the Cheat Sheet: http://tiny.cc/java-cs

Quellen

Inspiration für Probleme: