Konstruktor, Instanzvariablenvererbung

b1zarRe

Bekanntes Mitglied
Hi,

ich verstehe folgendes nicht:

Java:
public class A {
   //Instanzvariablen
  public int a = -1;

  //Konstruktor
  public A() {}

  //Methode
  public int gibA() {
     return this.a;
  }
}
----------------------------------------------------------
public class D extends A {
  //Instanzvariablen
  public int a = 100;

  //Konstruktor
  public D() {}

  //Methode
  public int gibEinA() {
    return super.gibA();
  }
}
----------------------------------------------------------
public class Test {
  public static void main(String[] args) {
     D d = new D();
     System.out.println(d.gibEinA());
     System.out.println(d.a);
  }
}
----------------------------------------------------------

Normalerweise(angefangen bei der "D" Klasse) müsste es ja zunächst der
D-Konstruktor aufgerufen werden, welcher quasi ein "unsichtbares" super() in der ersten
Zeile stehen hat. Also geht es "rauf" zu der A-Klassen-Konstruktor und danach wieder
zurück zum Konstruktor von D.

Sobald die Methode d.gibEinA() ausgeführt wird will er ja "super.gibA()" rechnen, und
geht also in die Oberklasse wo steht: return this.a. Nun, ich dachte immer "this" würde sich
immer auf das ursprüngliche Objekt beziehen, und somit müsste doch 100 herauskommen, so
wie es in Klasse D steht und nicht etwa -1. Okay, man kann wohl schlussfolgern, wenn man
in D Konstruktor nicht stehen hat a = 100 dann nimmt er einfach das a von der Oberklasse.
Stimmt aber auch nicht... er nimmt weiterhein -1 als Ergebnis. Nun könnte man schlussfolgern,
dass er einfach bei Namensgleichheit von Variablen in einer Vererbung einfach immer die höhere Variable nimmt und deshalbt -1 herauskommt und beim zweiten Aufruf deshalb die Variable von der wirklichen Klasse.

Irgendwie verwirrt mich das gerade zutiefst... Mag das vielleicht jemand erläutern warum das
so ist :autsch:

Denn, wenn ich folgendes stehen hätte:
Java:
public class A {
    public int a;
    public int b;

    public A() {
        this.a = 0;
        this.b = 40;
    }
    public void erhoehe(int summand) {
        a = a + summand;
    }
    public int gibWert() {
        return 2 * a;
    }
}
----------------------------------------------------------
public class B extends A {
    public int b;

    public B() {
        this.a = 10;
        this.b = 100;
    }

    @Override
    public int gibWert() {
        return b * super.gibWert(); 
    }
}
----------------------------------------------------------
public class Test {
    private static void testeSuper() {
        A a = new A();
        B b = new B();

        b.erhoehe(20);
        System.out.println(b.gibWert());
    }
 public static void main(String[] args) {
        testeSuper();
    }
}
----------------------------------------------------------

Benutzt er anscheinend nicht einfach das a bzw. b von der Oberklasse sondern
das von der Instanzklasse.... Also in diesem Fall von der Klasse B.
 
Zuletzt bearbeitet:

FrozenBrain

Mitglied
Eins vorweg: Konstruktoren werden nicht vererbt, lediglich Methoden und Attribute.

Du hast bei dir das Problem, dass du in sowohl Ober- als auch in der Unterklasse das Attribut "a" definierst. Methoden kannst du auf diese Weise überschreiben, Attribute allerdings nicht. Java behandelt die beiden "a"-Attribute daher so, als wären sie unterschiedliche Attribute (wie als hättest du zwei mit unterschiedlichem Namen), entsprechend wird die Methode das "a" der Oberklasse zurückgegeben. Wenn du in deiner Unterklasse einen anderen Wert für "a" haben möchtest, müsstest du den Wert im Konstruktor überschreiben (die erneute Deklaration von "a" fällt weg).

In deinem zweiten Code tust du genau das. Du gibst dem "b" deiner Unterklasse (da sie "b" als eigenes Attribut hat) und dem "a" der Oberklasse neue Werte im Konstruktor. Die Methode "erhoehe" arbeites deshalb auch mit dem neuen Wert von "a".
 
Zuletzt bearbeitet:

b1zarRe

Bekanntes Mitglied
Okay danke.

Habe ich denn dann bei dem 2. Beispiel immernoch zwei unterschiedliche a's bzw. b's?
Oder gibt es davon jetzt nurnoch jeweils eins, weil diese in dem Konstruktor einen neuen Wert erhalten haben?

Bei dem ersten Beispiel, habe ich ja den Wert für a direkt initalisiert. Spielt das keine Rolle? Sprich: Ist in dem Fall nur wichtig,
was die Konstruktoren machen und irrelevant, wie die Instanzvariablen machen? Ich dachte bisher, dass wenn ich eine
Instanz einer Klasse erstelle, zuerst der(bzw. die) Konstruktor(en) ausgeführt werden und danach oder davor auch
deren Instanzvariablen "erstellt" werden. Deshalb dachte ich bei Beispiel 1, dass das geerbte a überschrieben wird.

Ps.: Das Konstruktoren nicht vererbt werden weiß ich, aber diese werden ja nacheinander abgearbeitet, da bei einem Default-Konstruktor public B() {} quasi zunächst der Konstruktor der Oberklasse abgearbeitet wird.
 

FrozenBrain

Mitglied
Im Prinzip hast du schon Recht. Wird ein Objekt erstellt werden die Attribute deklariert und gegebenenfalls initialisiert und der Konstruktor aufgerufen (erst Attribute, dann Konstruktor).

Bei deinem 2. Beispiel hat Klasse "A" ein eigenes "a" und ein eigenes "b". Klasse "B" hat nur ein eigenes (zusätzliches) "b".

Wird der Konstruktor von Klasse "B" aufgerufen wird das "b" von Klasse "B" auf 100 gesetzt und das "a" der Klasse "A" (welches vererbt wird) auf 10. Wann du die Werte zuweist ist prinzipiell egal. Wichtig nur, wo du die Attribute deklarierst. Sprich: Wenn du in Oberklasse und Unterklasse zwei gleichnamige Attribute deklarierst, hat jede Klasse für das Attribut mit dem Namen auch seinen eigenen Wert.
 
Ähnliche Java Themen
  Titel Forum Antworten Datum
C OOP Parameter vom Konstruktor Java Basics - Anfänger-Themen 1
R Konstruktor mit Datum Java Basics - Anfänger-Themen 17
W Null-Pointer trotz Konstruktor? Java Basics - Anfänger-Themen 9
M Konstruktor-Aufruf im Konstruktor, aber nicht am Anfang? Java Basics - Anfänger-Themen 4
T Schlüsselworte Schlüsselwort this im Konstruktor Java Basics - Anfänger-Themen 3
frager2345 Warum muss ich hier im Konstruktor meine Exeption nicht abfangen ? Java Basics - Anfänger-Themen 4
J Konstruktor Java Basics - Anfänger-Themen 18
frager2345 Java Singleton Muster -> Methode für Konstruktor mit Parametern Java Basics - Anfänger-Themen 3
G Welche Attribute kommen in den Konstruktor? Java Basics - Anfänger-Themen 5
M wird der Konstruktor nicht als 1. ausgeführt? Java Basics - Anfänger-Themen 13
G Konstruktor und update Java Basics - Anfänger-Themen 4
K Kopier-Konstruktor Java Basics - Anfänger-Themen 6
S Default Konstruktor Java Basics - Anfänger-Themen 7
M Konstruktor ohne Übergabe eines Wertes Java Basics - Anfänger-Themen 7
M Wie kann ich in einem Konstruktor die Methode eines anderen Interfaces mit den jeweiligen Parametern aufrufen? Java Basics - Anfänger-Themen 8
J Vier gewinnt in Java,Spieler Konstruktor Java Basics - Anfänger-Themen 8
kxrdelis Konstruktor für ein Rechtwinkliges Dreieck Java Basics - Anfänger-Themen 10
Zeppi OOP Bruch kürzen im Konstruktor Java Basics - Anfänger-Themen 2
HorstSchröder Konstruktor mit Initialwert Java Basics - Anfänger-Themen 1
C Konstruktor ab serialisiertem Objekt Java Basics - Anfänger-Themen 4
J Input/Output Konstruktor ergänzen, der zur Datei mit einem Objekt passt Java Basics - Anfänger-Themen 0
InfinityDE Problem mit Datenübergabe an Konstruktor Java Basics - Anfänger-Themen 7
B Konstruktor mit Array als Parameter Java Basics - Anfänger-Themen 3
G Variablen Array Länge über den Konstruktor definieren Java Basics - Anfänger-Themen 4
L Konstruktor für eine Map-Datei/Map-Datei einlesen Java Basics - Anfänger-Themen 5
C Interface und Konstruktor Java Basics - Anfänger-Themen 1
H Generische Konstruktor Java Basics - Anfänger-Themen 12
MiMa Seltsames Verhalten im Konstruktor Java Basics - Anfänger-Themen 6
S Konstruktor passt nicht zum Rest Java Basics - Anfänger-Themen 11
C Unbekannter "Konstruktor"?? Java Basics - Anfänger-Themen 10
W OOP Warenlager mit Array(Konstruktor, Methoden) Java Basics - Anfänger-Themen 39
R Objekt in Konstruktor ist nicht zulässig Java Basics - Anfänger-Themen 5
A Mit einer Methode den Konstruktor aufrufen? Java Basics - Anfänger-Themen 2
B Warum können super() und this() nicht gemeinsam in einem Konstruktor verwendet werden? Java Basics - Anfänger-Themen 7
K Konstruktor für ein Objekt mit Zugriffsmethoden Java Basics - Anfänger-Themen 7
H Unterschied Konstruktor und Klassenname x = new Klassenname; Java Basics - Anfänger-Themen 3
B Klassen Array Parameter im Konstruktor? Java Basics - Anfänger-Themen 4
E Konstruktor mit Methode Java Basics - Anfänger-Themen 7
E ArithmeticException im Konstruktor Java Basics - Anfänger-Themen 4
S Konstruktor, Objekte Java Basics - Anfänger-Themen 4
F Konstruktor richtig implementiert? Frage zu Benutzereingaben... Java Basics - Anfänger-Themen 9
W Typecastin im Konstruktor? Java Basics - Anfänger-Themen 2
A Variablen Variablenwert über Konstruktor ändern Java Basics - Anfänger-Themen 3
F Arrays im Konstruktor Java Basics - Anfänger-Themen 5
C Konstruktor mit und ohne Parameterliste Java Basics - Anfänger-Themen 13
L Instanzvariablen, Veerbung, Konstruktor Java Basics - Anfänger-Themen 32
E Best Practice Konstruktor mit bestehender Intanz der gleichen Klasse aufrufen Java Basics - Anfänger-Themen 4
E Plausibilitätsprüfung in dem Konstruktor mit Ausnahmebehandlung Java Basics - Anfänger-Themen 8
A Aufruf von Konstruktor , obwohl 2 Parameter weggelassen werden Java Basics - Anfänger-Themen 7
A Aufruf von Konstruktor , obwohl 2 Parameter weggelassen werden Java Basics - Anfänger-Themen 0
D Compiler-Fehler Konstruktor von Superklasse übernehmen Java Basics - Anfänger-Themen 1
P Counter im Konstruktor Java Basics - Anfänger-Themen 11
J toString-Methode in Verbindung mit varArgs-Konstruktor Java Basics - Anfänger-Themen 18
I Einträge in den Konstruktor Java Basics - Anfänger-Themen 3
Aprendiendo [JAVA-Syntax] (int... variable) bei einem Konstruktor Java Basics - Anfänger-Themen 8
J Superklassen Konstruktor Verständnisfrage Java Basics - Anfänger-Themen 1
G Int-Array im Konstruktor Parameter Java Basics - Anfänger-Themen 37
T Datentypen Warum mit Konstruktor Objektvariablen initalisieren? Java Basics - Anfänger-Themen 19
A Vererbung bei Klassen mit Objekt der Klasse im Konstruktor Java Basics - Anfänger-Themen 4
P Konstruktor. Java Basics - Anfänger-Themen 4
D Best Practice Objekt automatisch im Konstruktor füllen? Java Basics - Anfänger-Themen 9
D Objekt oder Konstruktor Java Basics - Anfänger-Themen 2
F Java default Konstruktor Java Basics - Anfänger-Themen 1
R Fragen über den Konstruktor Java Basics - Anfänger-Themen 0
T Konstruktor mit Referenzdatentypen Java Basics - Anfänger-Themen 5
H Klassen Konstruktor Parameter als Instanzvariablen zwischen speichern... Java Basics - Anfänger-Themen 11
T setter im Konstruktor einbauen? Java Basics - Anfänger-Themen 8
R ArrayList im Konstruktor. Java Basics - Anfänger-Themen 4
T Konstruktor Probleme Java Basics - Anfänger-Themen 3
J Wie lässt sich der Konstruktor einer Klasse einer Funktion einer Klasse nutzen. Java Basics - Anfänger-Themen 4
S Variable, die im Konstruktor gesetzt wird, wird nicht gefunden vom Compiler. Java Basics - Anfänger-Themen 4
C Generic im Konstruktor Java Basics - Anfänger-Themen 1
F Privater Konstruktor und statische Methoden Java Basics - Anfänger-Themen 4
W Konstruktor von FileInputStream nicht gefunden Java Basics - Anfänger-Themen 18
B Methoden Konstruktor im Konstruktor aufrufen Java Basics - Anfänger-Themen 2
N Aufgabe: Pizza Konstruktor mit mehreren beliebigen Durchmesser/Preiskombinationen Java Basics - Anfänger-Themen 8
K arraygröße durch variablen Konstruktor? Java Basics - Anfänger-Themen 7
K ArrayList in Konstruktor - wie späterer Zugriff Java Basics - Anfänger-Themen 2
G Verwendung von Konstruktor Java Basics - Anfänger-Themen 8
X Übergabeparameter Konstruktor (File) Java Basics - Anfänger-Themen 13
K Wieso muss man finale statische Variablen sofort oder eben im Konstruktor initialisieren? Java Basics - Anfänger-Themen 2
C Konstruktor in Abstrakten Klassen Java Basics - Anfänger-Themen 4
B Konstruktor Problem Java Basics - Anfänger-Themen 8
Joew0815 konstruktor und damit erstellte objekte Java Basics - Anfänger-Themen 1
K Hashtable mit eigenen Konstruktor Java Basics - Anfänger-Themen 2
S Java Fragen Konstruktor & Statische Methoden Java Basics - Anfänger-Themen 4
H Fehler im Konstruktor abfangen Java Basics - Anfänger-Themen 10
J Konstruktor Problem bei Vererbung Java Basics - Anfänger-Themen 1
I Java Eingabe aus einer anderen Klasse in eine andere an Konstruktor übergeben Java Basics - Anfänger-Themen 4
O Konstruktor und Default Konstruktor Java Basics - Anfänger-Themen 7
S Kapselung Objekt bei Übergabe an Konstruktor nicht initalisiert Java Basics - Anfänger-Themen 3
I Vererbung Frage zum Konstruktor Java Basics - Anfänger-Themen 5
Y Konstruktor - Setter/Getter Java Basics - Anfänger-Themen 3
P Konstruktor Java Basics - Anfänger-Themen 4
E Initialisierung von Attributen und Konstruktor Java Basics - Anfänger-Themen 0
H Compiler-Fehler NullPointerException bei .length, Konstruktor fehlerhaft? Java Basics - Anfänger-Themen 3
M Objekt Array an konstruktor übergeben und Initialisieren Java Basics - Anfänger-Themen 1
llabusch Vererbung Super Konstruktor Java Basics - Anfänger-Themen 5
P Erste Schritte WindowBuilder erstellt Konstruktor wie zugreifen Java Basics - Anfänger-Themen 5
M Parameter von Konstruktor, der Superklassen-Konstruktor aufruft Java Basics - Anfänger-Themen 2

Ähnliche Java Themen


Oben