• Liebe User, bitte beachtet folgendes Thema: Was im Forum passiert, bleibt im Forum! Danke!
  • Hallo Gemeinde! Das Problem leidet zurzeit unter technischen Problemen. Wir sind da dran, aber das Zeitkontingent ist begrenzt. In der Zwischenzeit dürfte den meisten aufgefallen sein, dass das Erstellen von Posts funktioniert, auch wenn das Forum erstmal eine Fehlermeldung wirft. Um unseren Löschaufwand zu minimieren, bitten wir euch darum, nicht mehrmals auf 'Post Reply' zu klicken, da das zur Mehrfachposts führt. Grußworte.

Java HAs Vererbung - "this." - Methodenauswahl erst zur Laufzeit?

Mitglied seit
08.03.2004
Beiträge
1.574
Reaktionen
0
Meine Frage gleich vorweg, falls die auch ohne direktes Beispiel beantwortet werden kann. Wenn ich mit super in einer erbenden Klasse von der Mutterklasse einen Konstruktor aufrufe in dem eine Muttermethode this.buchen(float Betrag) verwendet wird, darf ich dann davon ausgehen, dass this erst zur Laufzeit aufgelöst wird, also die buchen(float Betrag) aus der erbenden Klasse verwendet wird?

Ok. Hier noch ein paar nähere Erläuterungen:

Ich habe eine Klasse Konto und eine Klasse Sparkonto, welche direkt von Konto erbt.

in Konto sieht die Methode buchen() so aus:

Code:
    public void buchen ( float Betrag) {
        this.Kontostand += Betrag;
    }

in Sparkonto dagegen so (Cheffe hat festgelegt, dass Sparkonten keine Kredite vergeben):

Code:
    public void buchen(float Betrag) {
        if ( (this.getKontostand() + Betrag) >= 0) {
            super.buchen(Betrag);
        }
    }


In Konto gibt es neben einem Standardkonstruktor folgenden:

Code:
    public Konto(int Kontonr, float Kontostand){
      this();
      this.Kontonr = Kontonr;
      this.buchen(Kontostand);
    }

In Sparkonto soll nun ein Konstruktor erzeugt werden, der das Gleiche macht wie der 2. Konto-Konstruktor, allerdings soll dabei natürlich die gleiche Bedingung beachtet werden, wie in der Buchenmethode vom Sparkonto.

wenn ich das jetzt einfach wie folgt mache:

Code:
    public Sparkonto(int Kontonr, float Betrag) {
        super(Kontonr, Betrag);
    }

wird dann die Buchenmethode von Konto, oder die von Sparkonto verwendet und wenn möglich warum?

Danke im Voraus!
 
Mitglied seit
08.03.2004
Beiträge
1.574
Reaktionen
0
Danke. Das macht es dann ja super.einfach() ;)
unser prof ist sehr pingelig dass wir immer schön kommentieren sollen, deshalb frage ich auch nach dem warum. Kann ich da als Begründung hinschreiben, dass this erst zur Laufzeit ausgeführt wird und "this" ist nunmal in dem Fall ein Sparkonto?
 

Bronzegraf

Guest
Dieses "this" Mitgeschleife trägt nicht gerade zum Verständnis bei, siehste ja selbst. Methodenaufrufe in Java sind normalerweise(¹) immer virtuell. Das heißt es wird erst zur Laufzeit die Hierarchie des aktuellen Objektes überprüft um die richtige (also die in der Hierarchie ganz unten vorkommende) Methode zu finden.

Wenn man es sich überlegt ist das auch logisch. Schließlich wird auch auf Bytecode-Ebene Code-Duplikation vermieden. Das bedeutet, dass eine .class Datei wirklich nur den Bytecode in sich trägt, der dem Quelltext entspricht und nicht noch zusätzlich den ganzen Kram von den Elter-Klassen. Somit kann das ganze auch erst zur Laufzeit ausgewertet werden.


(¹): Ausnahmen sind natürlich finale Methoden, finale Klassen oder Methodeaufrufe mit (super.)* davor. Hier können die konkreten Aufrufe schon zur Übersetzungszeit in den Bytecode statisch eingebaut werden.
 

RRA^StArFiRe

Guest
generell objektverweise, sei es mit nem pointer oder mit dem quasi this-pointer...
die zeigen immer auf instanziierte objekte.

und hast du von der superklasse eine instanz erzeugt?
wohl eher nicht ;)
 
Oben