# Uebungsblatt 02
# Aufgabe 1
## a)
### (1)
public void give (int a, float b), lässt sich erweitern zu (long a, float b), (float a, float b), (double a, float b), (int a, double b), (long a, double b), (float a, double b), (double a, double b)
public void give (int a, int b). Die Signatur lässt sich zu (long a, int b),
(float a, int b), (double a, int b), (int a, long b), sowie (int a, float b) und die bereits genannten Erweiterungen.
public void give (double a, int b). Die Signatur lässt sich zu (double a, long b), (double a, float b), (double a, double b) erweitern.
public void give (double a, double b) Die Signatur lässt sich nicht erweitern
public void give (String a, int b). Die Signatur erweitern sich auf (String a, long b), (String a, float b), (String a, double b).
public void give (int[] a, int b). Die Signatur lässt sich nicht erweitern.
public void give (long[] a, int b). Die Signatur lässt sich nicht erweitern.
### (2)
a ist von typ float, und b von typ int. Es gibt jedoch keine Methodensignatur mit `give(float a, int b)`, also wird `give(double a, int b)` verwendet, da float durch double ersetzbar ist.
### (3)
`0.0`
## b)
``` java
Klasse k = new Subklasse()
// statisch: k == Klasse
// dynamisch: k == SubKlasse
Subklasse k2 = (Subklasse) k;
// statisch: k2 == Subklasse
// dynamisch: k2 == Subklasse
```
## c)
Das Ersetzbarkeitsprinzip besagt, dass wenn gilt:
Instanzen von **B** fördern *höchstens* und bieten *mindestens* das gleiche wie Instanzen von **A**.
Dann ist **B** mit **A** ersetzbar.
## d)
Ein Typ in Java ist entweder ein primitiver typ, wie *int* oder *float*, oder ein Objekt, wie *Integer* und *Float*.
# Aufgabe 2
## a)
• Instanzvariable i: Die Variable i aus „Sub“ verdeckt die Variable i aus „C“. Es gilt nämlich, dass Instanzvariablen (sowie Klassenvariablen /-methoden) gleichbenannte Variablen des Obertyps verdecken, unabhängig vom Typ. D.h. beim Aufruf der verdeckten Variable in der Unterklasse kann auf die gleichbennante Variavble der Oberklasse nur über "super" oder per Typecast zugegriffen werden.
• Klassenmethode getI (): Die Methode getI () aus der Oberklasse wird von der Methode getI() der Unterklasse überschrieben, da sie die gleiche Signatur, den gleichen Namen und den gleichen Rückgabetyp hat. Die Methode der Unterklasse kann nun frei neu implementiert werden und wird beim Aufruf zuerst berücksichtigt.
• Klassenvariable s: Für die Klassenvariable s gilt das gleiche wie für die Instanzvariable i, sie verdeckt die gleichbenannte Variable s aus der Oberklasse, ebenfalls unabhängig vom Typ. Der Aufruf der verdeckten Variable kann erneut nur über "super" oder per Typecast durchgeführt werden.
• Klassenmethode getS(): Die Klassenmethode aus der Unterklasse verdeckt die Klassenmethode der Oberklasse, da sie die gleiche Signatur haben. Die Verdeckung funktioniert genauso wie die Verdeckugn bei Variablen.
## b)
• Zeile 2: 10
• Zeile 3: 20
• Zeile 4: Klasse C10
• Zeile 5: Klasse Sub20
• Zeile 6: 1
• Zeile 7: 2
• Zeile 8: Sub-Instanz2
• Zeile 9: Sub-Instanz2
Zeile 2 und 4 greifen direkt über c auf die jeweilige Operation/Variable zu. Da es sich bei diesen um Klassenmethoden/-variablen handelt (static), also Variablen/Operationen, die jedem Klassenobjekt zugewiesen wurden, wird die statische Klasse des Objekts betrachtet, also in diesem Fall C. Deswegen wird bei diesen Zugriffen auf die Variable s und Methode getS der Oberklasse zugegriffen, daher die Ausgaben „10“ und „Klasse C10“.
In Zeile 3 und 5 wird das Objekt c vor dem Zugriff zu einem Objekt der Klasse Sub gecastet, somit werden beim Aufruf über c die Methoden getS() und Variable s der Unterklasse Sub betrachtet.
## c)
"this" ist eine Variable die eine Referenz auf das Objekt speichert auf dem es aufgerufen wird. Es kann nicht in Klassenmethoden aufgerufen werden, da diese sich auf alle Objekte der Klasse beziehen und nicht auf ein spezifisches.