Vererbung this innerhalb von super

Oekel

Mitglied
Könnt ihr mir bitte Links/Quellen/Stichwörter nennen, die folgenden Testcode/Ausgabe erklären?

Java:
package testVererbung;

public class main {
    public static void main(String[] args) {
        Grossvater person = new Kind();
        System.out.println(person); //wandern mit 40 und geradem Rücken
        System.out.println(person.alter);//80
    }
}
public class Grossvater {
    int alter = 80;
    public String ruecken() {
        return "kaputtem";
    }
}
public class Vater extends Grossvater {
    int alter = 40;
    public String wandern()
    {
        return "wandern mit "+alter+" und "+this.ruecken() +" Rücken";
    }
    public String ruecken() {
        return "krummen";
    }
    public String getAlter()
    {
        return ""+this.alter;
    }
}
public class Kind extends Vater {

    int alter = 16;
    public String toString()
    {
        return super.wandern();
    }
    public String wandern()
    {
        return "wandern mit "+getAlter()+"und "+this.ruecken();
    }
    public String ruecken() {
        return "geradem";
    }
}

---------------------------------
Mir ist soweit klar,dass innerhalb von "Vater" es keinen Unterschied macht, ob ich ruecken() oder this.ruecken() aufrufe. Es wird immer die überschriebene Methode von der aktuellen Instanz verwendet. Gibt es denn eine Möglichkeit in Java dieses zu verhindern? (Wüsste nicht wie, da es der Vererbungslehre wiederspricht!?)
Und nun noch kurz zu den Variablen "alter". Gilt hier keine Vererbungstheorie?

Grüße Oekel
 
Zuletzt bearbeitet von einem Moderator:

mrBrown

Super-Moderator
Mitarbeiter
sout(person) ruft #toString auf der Instanz von Kind auf.
In toString wird super.wandern aufgerufen, also #wandern von Vater. in wandern wird this.alter (=40) benutzt, was das alter von Vater ist. Das Alter von Kind kennt Vater gar nicht, und das von Großvater wird hinter dem von Vater "versteckt". this.ruecken() ruft dann die #rücken-Implementierung von Kind auf, wie du auch schon gesagt hast, = "gerade".

person ist als Großvater deklariert, also wird bei person.alter das alter vom Großvater zurückgeben.

Und nun noch kurz zu den Variablen "alter". Gilt hier keine Vererbungstheorie?
Auch wenn die 3 Variablen alter gleich heißen, es sind unterschiedliche Variablen!


Mir ist soweit klar,dass innerhalb von "Vater" es keinen Unterschied macht, ob ich ruecken() oder this.ruecken() aufrufe. Es wird immer die überschriebene Methode von der aktuellen Instanz verwendet. Gibt es denn eine Möglichkeit in Java dieses zu verhindern? (Wüsste nicht wie, da es der Vererbungslehre wiederspricht!?)
Man kann verhindern, dass Methoden überschrieben werden. Tut man das nicht, wird immer die "niedrigste" Implementierung (die der Instanz) verwendet.
 

Oekel

Mitglied
sout(person)
....in wandern wird this.alter (=40) benutzt, was das alter von Vater ist. Das Alter von Kind kennt Vater gar nicht ...

vs.
sout(person)
....this.ruecken() ruft dann die #rücken-Implementierung von Kind auf....
(Tut man das nicht), wird immer die "niedrigste" Implementierung (die der Instanz) verwendet.

Hat mich da etwas verwirrt. Also der 'this' Aufruf auf Basis von Variablen vs Methoden.
Denn innerhalb von Vater komme ich ja mit "alter oder this.alter" auf '40' und mit "super.alter" auf '80'. (Selbst wenn die Instanz ein "Kind" ist ; habe also keine Chance dynamisch auf die unterste Ebene zu kommen außer mittels getter())
Jedoch mit "ruecken() oder this.ruecken()" auf 'gerade' und mit "super.ruecken()" auf 'kaputtem'.
(Somit also keine Chance auf die Methode des Vaters innerhalb von Vater zu kommen, außer die Instanz ist 'nur' ein Vater)

Habe ich das nun korrekt außeinander gezogen?

Grüße Oekel
 

mrBrown

Super-Moderator
Mitarbeiter
Hat mich da etwas verwirrt. Also der 'this' Aufruf auf Basis von Variablen vs Methoden.
Variablen und Methoden sind vollkommen unterschiedlich - Variablen existieren einfach, Methoden haben eine Implemenation und eine können damit auch überschrieben werden. Mehrfach eine Variable deklarieren führt nur neue Variablen ein (die gleich heißen->ganz schlechter Stil), ändert aber nichts an der ursprünglichen.

Denn innerhalb von Vater komme ich ja mit "alter oder this.alter" auf '40' und mit "super.alter" auf '80'. (Selbst wenn die Instanz ein "Kind" ist ; habe also keine Chance dynamisch auf die unterste Ebene zu kommen außer mittels getter())
this.alter und super.alter sind unterschiedliche Variablen! Das ist eben etwas anderes, als (überschriebene) Methoden.

Jedoch mit "ruecken() oder this.ruecken()" auf 'gerade' und mit "super.ruecken()" auf 'kaputtem'.
(Somit also keine Chance auf die Methode des Vaters innerhalb von Vater zu kommen, außer die Instanz ist 'nur' ein Vater)
Man "kennt" seine eigene und die super-Implementierung. #super braucht man uU, um die eigene Implementierung überschreiben zu können.
Ausgeführt wird aber immer die Implementierung der aktuellen Instanz.

Wenn es während der Laufzeit bei Methoden die nicht final sind relevant ist, ob jetzt super, this, oder überschriebenes aufgerufen wird, ist irgendwas grundsätzliches am Design falsch.

ZB beim Beispiel oben: Ein Kind ist nicht immer ein Vater (und ein Großvater), die Umsetzung so ist also mehr als Zweifelhaft. (andersrum wäre Ok, also Kind->Vater->Großvater (jeder Großvater ist schließlich irgendwessen Vater, und jeder Vater das Kind von irgendwem)).
Genauso das mehrfache deklarieren von alter, gleich heißende Variablen sind immer ziemlich schlechter Stil und führen nur zu Verwirrung.
 

Oekel

Mitglied
Ok danke soweit. Das Bsp. von mir ist in der Tat sehr Zweifelhaft, erfüllt aber denke ich den Zweck und zeigt wieso ich verwirrt war. Konkret und abschließend ist zu sagen, dass ich gerade wirklich schlecht geschriebenen/kopierten Code refaktore und eben an meinem eigenen Verstand gezweifelt habe, als ich sah wie eine KOMPLETTE Klasse (die vermutlich "etwas" erweitern sollte) mit ALL ihren Methoden und privaten Variablen incl. Gettern/Settern kopiert wurde, ein extend hinter geklatscht und auf das original zwei drei Methoden leicht angepasst wurden. Da fragte ich mich halt, ob innerhalb der neuen Methoden die alten (gleichgebliebenen) nicht mehr verwendet werden können/dürfen/sollen. Was natürlich bei 1:1 CnP totaler Blödsinn ist. ......wenn ihr wüsstet welcher namenhafter Hersteller dahinter steht (*Kopfschüttel*)....
 

mrBrown

Super-Moderator
Mitarbeiter

Oekel

Mitglied
Die der Superklasse können mit super verwendet werden - andere nicht.

Das ist klar ;) Ich glaube aber du hattest mich falsch verstanden (ist auch keine Frage mehr, sondern ein Erklärungsversuch)

Ich befinde mich in der ERBENDEN Klasse und rufe mit super die Funktionen der ELTERNKLASSE auf:
Wenn nun aber die ELTERNKLASSE zwei Methoden hat von der die eine auf die andere verweist und beide überschrieben wurden, dann besteht nicht die Chance (und das ist auch gut so!!!!) dass die erste Methode (welche wir von "unten" aufrufen) der Elternklasse die zweite (Implementierung) von IHR (Elternklasse) aufruft (und steht dort noch 100Mal "this" vor), statt dessen überschriebenen Methode in der ERBENDEN, (von der der Aufruf ursprünglich ja kam). Also noch Mal "this" hat nichts mit der Definition zu tun, wo es niedergeschrieben wurde (das wollte ich nämlich für kurze Zeit glauben), sondern mit der Instanz, die später existiert.
 
Ähnliche Java Themen
  Titel Forum Antworten Datum
G Innerhalb von Runnable auf super. zugreifen? Java Basics - Anfänger-Themen 3
I Viereck / Rechteck Prüfung innerhalb einem bestimmten Bereich Java Basics - Anfänger-Themen 2
I Innerhalb einem Bild ein Teil austauschen Java Basics - Anfänger-Themen 26
F wie kann ich die Position des letzten Vokals innerhalb einer Zeichenkette ermitteln? Java Basics - Anfänger-Themen 5
J int innerhalb einer Datei ändern Java Basics - Anfänger-Themen 1
J if-Schleife innerhalb einer if-Schleife wird in der Konsole nicht gelesen Java Basics - Anfänger-Themen 4
I Variable innerhalb Methode: Local variable test defined in an enclosing scope must be final or effectively final Java Basics - Anfänger-Themen 3
J Verschieben von Buchstaben in einem String um vorgegebene Anzahl von Zeichen innerhalb eines weiteren String Java Basics - Anfänger-Themen 12
I ArrayList erstellen innerhalb einer Zeile? Java Basics - Anfänger-Themen 3
Z Erste Schritte Indexe innerhalb eines Arrays zusammensählen Java Basics - Anfänger-Themen 14
B Summe von Property innerhalb einer Liste via Lambda Java Basics - Anfänger-Themen 1
M Auf einen Array innerhalb eines Objekts zugreifen Java Basics - Anfänger-Themen 5
B Enum innerhalb einer Klasse / anderes Konzept Java Basics - Anfänger-Themen 8
dapzoo Innerhalb eines Jahres intensivem Java-Selbststudium zur Anstellung? Java Basics - Anfänger-Themen 37
S Wert innerhalb eines anderen Wertes Java Basics - Anfänger-Themen 3
T split innerhalb Klammern ignorieren? Java Basics - Anfänger-Themen 6
x-tshainge Innerhalb von Textdatei addieren Java Basics - Anfänger-Themen 9
I Try-Catch innerhalb eines Catchblocks Java Basics - Anfänger-Themen 1
J Innerhalb von Zeichenketten tauschen Java Basics - Anfänger-Themen 1
S BufferedWriter innerhalb einer Methode Java Basics - Anfänger-Themen 2
H Innerhalb einer Methode eine Variable der aufrufenden Methode ändern? Java Basics - Anfänger-Themen 2
H For-Schleife innerhalb If-Abfrage? Java Basics - Anfänger-Themen 3
A Werte innerhalb von resultset vergleichen Java Basics - Anfänger-Themen 2
B Key auslesen/ausgeben innerhalb von foreach() Java Basics - Anfänger-Themen 5
MiMa abbruch innerhalb einer Rekursiven Schleife Java Basics - Anfänger-Themen 5
J Array innerhalb einer Funktion mehrfach iniatilisieren Java Basics - Anfänger-Themen 4
Silvascus Erste Schritte Werte innerhalb eines Arrays addieren Java Basics - Anfänger-Themen 3
L Punkt innerhalb eines Bereiches verschieben Java Basics - Anfänger-Themen 9
J Innerhalb Interfacemethode: Interface als Attribut Java Basics - Anfänger-Themen 2
I Innerhalb einer Methode suchen und hinzufügen. Neues Objekt in Suche dann? Java Basics - Anfänger-Themen 8
S Classpath: Alle .jars innerhalb eines Ordners einbinden Java Basics - Anfänger-Themen 4
M Farben/Color Abfragen von Farben innerhalb einer Methode Java Basics - Anfänger-Themen 9
T Erste Schritte run innerhalb eines package Java Basics - Anfänger-Themen 1
I Rückgabe und Aufruf einer Methode innerhalb einer anderen Methode Java Basics - Anfänger-Themen 5
B Variablen global abspeicher innerhalb von Methoden Java Basics - Anfänger-Themen 7
D Methoden Implementieren von einer Zoomfunktion innerhalb eines JPanels mit null-Layoutmanager Java Basics - Anfänger-Themen 1
M Throws Anweisung innerhalb eines Methodenkopfes unklar Java Basics - Anfänger-Themen 4
M Variablen Zugriff von außerhalb eines Blockes auf eine Variable innerhalb eines Blockes Java Basics - Anfänger-Themen 2
M Text innerhalb Anführungsstriche als "eins" auswerten Java Basics - Anfänger-Themen 5
O Files eines Directories innerhalb eines JAR-Files auflisten Java Basics - Anfänger-Themen 0
S Funktionen/Atrribute nur innerhalb einer package Zugänglich machen Java Basics - Anfänger-Themen 8
I JTextfield[] innerhalb eines Itemlistener aufrufen Java Basics - Anfänger-Themen 2
B Zufallsdatum innerhalb eines bestimmten Bereiches erzeugen Java Basics - Anfänger-Themen 3
D OOP Identifzierung eines Objektes innerhalb eines Array Java Basics - Anfänger-Themen 3
G Bewegung innerhalb eines Koordinatensystems berechnen Java Basics - Anfänger-Themen 9
P Kapselung Variable innerhalb einer inneren Klasse ansprechen ohne ein Objekt erzeugen zu müssen? Java Basics - Anfänger-Themen 6
L Next()-Aufruf zweimal innerhalb einer While-Schleife bei ListIterator Java Basics - Anfänger-Themen 10
W Methodenaufruf innerhalb einer Klasse - static vs. this Java Basics - Anfänger-Themen 3
B for-schleife innerhalb neuer Methode Java Basics - Anfänger-Themen 5
N Innerhalb des Programmes RAM einstellen Java Basics - Anfänger-Themen 2
J Variablen überschreiben innerhalb einer Klasse Java Basics - Anfänger-Themen 7
N Zugriff auf Werte in Arrays innerhalb ArrayList Java Basics - Anfänger-Themen 2
A Zugriff auf Komponente innerhalb einer JPanel Java Basics - Anfänger-Themen 8
H Innerhalb eines Package wird eine Klassenmethode nicht gefunden. Java Basics - Anfänger-Themen 2
Kaniee Zugriffe innerhalb eines Arrays Java Basics - Anfänger-Themen 9
A objekt innerhalb der gleiche klasse Java Basics - Anfänger-Themen 10
J Dateien innerhalb einer JAR verwenden Java Basics - Anfänger-Themen 3
J Innerhalb der Border zeichnen Java Basics - Anfänger-Themen 9
P Unterschied JRE innerhalb/ außerhalb des JDK Verzeichnisses? Java Basics - Anfänger-Themen 5
S Input/Output Problem mit dateizugriff innerhalb der .jar (Applet) Java Basics - Anfänger-Themen 2
K Zufällige Auswahl innerhalb eines Arrays und Arrays aus JLabel füllen Java Basics - Anfänger-Themen 32
K Bild mit Maus innerhalb eines Rahmens bewegen Java Basics - Anfänger-Themen 5
E Zeile innerhalb Datei überschreiben Java Basics - Anfänger-Themen 2
K Methoden Zustand innerhalb einer Instanz ändern Java Basics - Anfänger-Themen 2
M Java-Prog soll Texte innerhalb Bildern erkennen Java Basics - Anfänger-Themen 2
S Variablen Variable innerhalb eines if-Statements? Java Basics - Anfänger-Themen 10
N OOP Zugriff auf eine Objekt innerhalb einer Klasse aus statischen Methoden Java Basics - Anfänger-Themen 9
S Innerhalb eines Fensters ein neues erschaffen Java Basics - Anfänger-Themen 7
E Elemente innerhalb eines Arrays vergleichen Java Basics - Anfänger-Themen 7
M Main methode innerhalb von Java aufrufen Java Basics - Anfänger-Themen 11
A lokale Variable innerhalb "actionPerformed()" Java Basics - Anfänger-Themen 10
L Lokale Variable und Instanzvariable innerhalb Iterator Java Basics - Anfänger-Themen 8
M FileWriter innerhalb runnable Jar Java Basics - Anfänger-Themen 8
J Diverse Frag zu Vererbung innerhalb von Java Java Basics - Anfänger-Themen 6
O Änderungen innerhalb for-Schleife speichern Java Basics - Anfänger-Themen 17
J Wie auf eine Datei innerhalb des JAR-Files zugreifen Java Basics - Anfänger-Themen 2
radiac Datentypen RANDOM-punkt setzen INNERHALB eines BEREICHes Java Basics - Anfänger-Themen 2
T switchcase innerhalb Schleife: von case-Fall aus Schleife beenden Java Basics - Anfänger-Themen 3
L Timer innerhalb eines Threads Java Basics - Anfänger-Themen 3
H Klassen zur Anzeige ines Bildes und zum Zeichnen innerhalb diese Bildes Java Basics - Anfänger-Themen 2
D Datei innerhalb einer zip bearbeiten Java Basics - Anfänger-Themen 8
D .class-Datei innerhalb einer .jar-Datei verändern Java Basics - Anfänger-Themen 4
R Interface innerhalb einer Klasse definieren..? Java Basics - Anfänger-Themen 2
M Methode innerhalb Methode Java Basics - Anfänger-Themen 10
C Variable Zeichenkette innerhalb einer Schleife ersetzen Java Basics - Anfänger-Themen 4
Das Brot Relative Pfadangaben innerhalb von .jar Archiven Java Basics - Anfänger-Themen 7
C Textausgabe auf Panelen innerhalb eines Applets Java Basics - Anfänger-Themen 6
Screen Mouserobot clonen? Zeiger nur innerhalb eins Fensters? Java Basics - Anfänger-Themen 3
E Boolean wert innerhalb einer Tabelle ändern Java Basics - Anfänger-Themen 4
N aus .txt innerhalb eines JARs Zeilenweise lesen Java Basics - Anfänger-Themen 8
G Texte innerhalb von Dateien suchen Java Basics - Anfänger-Themen 9
D Relativer Pfad innerhalb jar Datei Java Basics - Anfänger-Themen 5
M if Abfrage innerhalb einer for-Schleife Java Basics - Anfänger-Themen 2
M if Abfrage innerhalb einer for-Schleife Java Basics - Anfänger-Themen 3
M Variablen innerhalb der properties-datei Java Basics - Anfänger-Themen 2
K Objekte innerhalb einer Klasse Java Basics - Anfänger-Themen 2
G Class innerhalb einer .jar editieren Java Basics - Anfänger-Themen 2
J Thread innerhalb einer Methode starten Java Basics - Anfänger-Themen 3
bugmenot Laden einer Resourcendatei innerhalb einer Datei. Java Basics - Anfänger-Themen 19
M Methode innerhalb einer klasse aufrufen Java Basics - Anfänger-Themen 26

Ähnliche Java Themen

Neue Themen


Oben