9th Java Lesson (Java Course @ TUD)

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

December 16, 2021

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

Java

Objektorientierte Programmierung

Florian Kluge, Moritz Schulz

  1. Dezember 2021


Florian.Kluge@mailbox.tu-dresden.de

Moritz.Schulz2@mailbox.tu-dresden.de

Was wir heute machen

Objektorientierte Programmierung: Vererbung

  1. Kurze Wiederholung zu Vererbung
  2. Overloading
  3. Overriding
  4. super()
  5. die Object-Klasse
  6. Aufgabe

Contact

Florian Kluge

Florian.Kluge@mailbox.tu-dresden.de

Moritz Schulz

Moritz.Schulz2@mailbox.tu-dresden.de

Kurze Info zum Kurs

  • bitte abmelden / entschuldigen, wenn ihr nicht kommt
    • zwei Mal in Folge unentschuldigt fehlen => ausgetragen
  • praktische Aufgaben- und Beispiel-basierte Lernweise
    • wir laufen herum und gucken, dass ihr zurecht kommt
  • bitte, fragt gern, jederzeit
    • auch per E-Mail / via Kursseite
  • 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
    • im neuen Jahr: Bekanntgabe, ob Präsenz / online

Los geht’s!

kurze Wiederholung

  • am Beispiel der Aufgabe vom letzten Mal
    • static
    • Vererbung mit extends
    • superclass und subclass

Vererbung und UML - Aufgabe

Ausflug: Overloading

  • Overloading ermöglicht es uns mehreren Methoden/Funktionen mit gleichem Namen verschiedene Parameter zu zuweisen
    • gleicher Name, aber unterschiedliche Parameter (und Datentypen)
  • Beispiel:
    • String meineMethode(int param)
    • void meineMethode(String param)

Overloading - Gegenbeispiel

static int sumInt(int a, int b) {}

static float sumFloat(float a, float b) {}

static double sumDouble(double a, double b) {}!
  • Methoden/Funktionen mit gleicher Aufgabe, aber komplett anderen Namen
    • sorgt für unnötige Komplexität
  • stattdessen: Overloading!

Overloading - good!

static int sum(int a, int b) {} // Funktion, welche a + b rechnet

static float sum(float a, float b) {} // nun mit Datentyp float!

static double sum(double a, double b) {} // .. oder double!

Overloading - Nutzung in Java

static int sum(int a, int b) {}
static float sum(float a, float b) {}
static double sum(double a, double b) {}

// zum Beispiel in main(String[] args):
    sum(3,5);
    sum(4.3f, 5.0f);
    sum(0.3d, 16.d);
  • Java sucht sich die richtige Methode passend zu den hinzugefügten Datentypen!

Overloading

das geht natürlich auch mit anderen Datentypen:

    public static void printTwoVariables(int a, String b) {
        System.out.println("a: " + a + " b: " + b);
    }

    public static void printTwoVariables(boolean a, String b) {
        System.out.println("a: " + a + " b: " + b);
    }

Overloading

mit Overloading können wir auch die Anzahl der Variablen verändern


public static void sumOfMultiple(int a, int b) {
System.out.println(a + b);
}

public static void sumOfMultiple(int a, int b, int c) {
System.out.println(a + b + c);
}

public static void sumOfMultiple(int a, int b, int c, int d) {
System.out.println(a + b + c + d);
}

// zum Beispiel in main(String[] args):
  
  sumOfMultiple(1, 1); // 2
  sumOfMultiple(1, 1, 1); // 3
  sumOfMultiple(1, 1, 1, 1); // 4

Overloading

constructors können auch ‘overloaded’ werden

class Quadrat {
    int hoehe, breite;
    
    public Quadrat(int h, int b) {
        this.hoehe = h;
        this.breite = b;
    }
    
    // Seitenlaenge hoehe gleich breite wenn nur ein Parameter uebergeben wird
    public Quadrat(int a) {
        this.hoehe = a;
        this.breite = a;
    }
}

Overloading - Aufgabe

  • schreibt die overloaded Funktion static ... product(/* .. Parameter .. */)
    • sie multipliziert zwei Zahlen a * b für verschiedene Datentypen
    • Name der Funktion muss gleich bleiben!
    • Datentypen: float, double, int
  • Erweiterungsideen
    • auch für 3 Parameter
    • wer ganz schnell ist: einen Array als Parameter
// so soll es verwendet werden:

int a = product(3, 3);
float b = product(3.1f, 0.3f);
double d = product(6.6d, 1.12d);

// wie sehen die einzelnen Methoden aus?

Overloading - Aufgabe

static int product(int a, int b) {
    System.out.println(a * b);
}

static float product(float a, float b) {
    System.out.println(a * b);
}

static double product(double a, double b) {
    System.out.println(a * b);
}

Das war schon Overloading

  • Mehrere Methoden / Funktionen, die
    • den gleichen Namen haben
    • andere Paramter und Rückgabewerte haben
      • Datentyp, Anzahl
  • Java muss aber immer noch wissen, was gemeint ist!
    • z.B. keine zwei Funktionen, die genau gleich sind

Overriding

  • Overriding erlaubt uns Methoden der Eltern-Klasse (superclass) zu überschreiben
  • dazu schreiben wir vor die Methode @Override

Overriding

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):
    Pig pig1 = new Pig();
    pig1.makeSound(); // 'oiinkk' und nicht 'some generic animal sound'

Overriding

  • wir können also Methoden aus der Elternklasse überschreiben und nach Belieben anpassen
    • manche Klasse benötigen die gleichen Methoden wie ihre Eltern-Klasse aber eine andere Ausführung
  • aber: return-Datentyp und Parameter müssen gleich sein!

Vergleich - Overriding und Overloading

  • einzige Gemeinsamkeit:
    • Funktionen / Methoden mit gleichen Namen
  • Overloading:
    • erlaubt, Funktionen / Methoden mit unterschiedlichen Parameter gleich zu nennen
    • generell genutzt
  • Overriding:
    • überschreibt den “Inhalt” der Methode in der superclass
    • Verwendung nur im Zusammenhang mit Vererbung

super()

  • mit super() rufen wir den Konstruktor der Eltern-Klasse auf
    • innerhalb des Konstruktors der Kind-Klasse subclass
public class SuperClass {
    public SuperClass(String a) {
        System.out.println(a);
    }
}

class AnotherClass extends SuperClass {
    public AnotherClass() {
        // ruft den Konstruktor der Eltern-Klasse auf und übergibt die benoetigen Parameter
        super("some string!");
    }
}

super() - Beispiel

  • Student erbt von Person
  • Person hat einen Namen
  • also hat Student auch einen Namen
public class Person {
    String name;
    
    public SomeClass(String name) {
        this.name = name;
    }
}

class Student extends Person {
    public Student(String name) {
        super(name);
    }
}

Wieso eigentlich super()? 1/2

  • vermeidet Dopplung von Code
    • siehe Beispiel zuvor: Attribut name übernehmen
  • kann auch Standardwerte festlegen
    • Professor extends Person könnte Standardwert für Beruf festlegen

Wieso eigentlich super()? 1/2

  • wird im constructor der subclass automatisch aufgerufen, wenn in der superclass ein ähnlicher constructor existiert
    • => super() ist im constructor der subclass erforderlich, wenn es in der superclass keinen constructor gibt, der ihm ähnelt
  • kann spezialisieren (siehe Beispiel unten)
class Rechteck {
    int breite;
    int hoehe;
    
    public Rechteck(int a, int b) {
        this.breite = a;
        this.hoehe = b;
    }
}

class Quadrat extends Rechteck {
    public Quadrat(int a) {
        super(a,a);
    }
}

Object-Klasse

‘Class Object is the root of the class hierarchy. Every class has Object as a superclass. All objects, including arrays, implement the methods of this class.’

aus der Dokumentation: [https://docs.oracle.com/javase/7/docs/api/java/lang/Object.html](https://docs.oracle.com/javase/7/docs/api/java/lang/Object.html)

Object-Klasse

  • jede Klasse erbt von Object
    • jede Klasse hat auch Zugriff auf die Methoden der Klasse Object!
    • Beispiel:
      • String toString()
    • Hinweis: System.out.println() ruft immer die Methode toString() auf!

Object-Klasse

public class Person {
    String name;
    public Person(String name) {
        this.name = name;
    }
    
    public String toString() {
        return "Die Person namens " + this.name;
    }
}

// zum Beispiel in main(String[] args):
    Person max = new Person("Max");

    // ruft automatisch max.toString() auf!
    System.out.println(max);
    // gibt aus: 'Die Person namens Max'

mit neuem Wissen…

  • Aufgabe weiterbearbeiten, falls noch nicht fertig
    • wichtig: Klassenstruktur des UML-Diagramms so in Java übernehmen!
  • Anwendung von toString() zur Beschreibung der Person
  • Nutzung von super() für die Konstruktoren von Student, Dozent
  • Anwendung von toString() zur Beschreibung der Person
  • Nutzung von super() für die Konstruktoren von Student, Dozent

Pro-Tipp: Lernt Documentations zu lesen!

  • Dokumentation ist wie ein vollständiges Cheat Sheet
  • Websuche nach: Java Dokumentation

Nächste Stunde

  • Weiterführende Konzepte zu Objektorientierter Programmierung

Tipps:

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

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