Während Ihr darauf wartet, dass es beginnt..
Java
Objektorientierte Programmierung
Florian Kluge, Moritz Schulz
- Dezember 2021
Florian.Kluge@mailbox.tu-dresden.de
Moritz.Schulz2@mailbox.tu-dresden.de
Was wir heute machen
Objektorientierte Programmierung: Vererbung
- Kurze Wiederholung zu Vererbung
- Overloading
- Overriding
- super()
- die Object-Klasse
- Aufgabe
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
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
- 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
- jede Klasse erbt von
Object
- jede Klasse hat auch Zugriff auf die Methoden der Klasse Object!
- Beispiel:
- 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:
- Advent of Code (tägliche Programmieraufgaben):
- Aufgabe der letzten Stunde: “Adventskalender”: