"Grundkurs Programmieren in Java - (9. Auflage, 2024)"
2001-2024, Carl Hanser Verlag

Lösungsvorschlag zu Aufgabe 8.8 (Version 3.0)

(c) 2001-2024 D. Ratz, D. Schulmeister-Zimolong, D. Seese, J. Wiesenberger

a)

Klasse A:
  class A {
    A() {
      System.out.println("A()");
    }
  }
Analog dazu Klasse B:
  class B {
    B() {
      System.out.println("B()");
    }
  }
Klasse C sieht dann wie folgt aus:
  class C extends A {
    B b = new B();
  }
Klasse TestABC:
public class TestABC {

  public static void main(String args[]) {
    C c = new C();
  }

}

Quelltext: TestABC.java

b)

Programmausgabe:
  E:\hiwi\temp>java TestABC
  A()
  B()


c)

Klasse A:
  class A {
    A(int i) { System.out.println("A()"); }
  }
Klasse B:
  class B {
    B(int i) { System.out.println("B()"); }
  }
Klasse C:
  class C extends A {
    B b;
    C(int i) {
      super(i);
      b = new B(i);
    }
  }
Klasse TestABCmod:
public class TestABCmod {

  public static void main(String args[]) {
    C c = new C(1);
  }

}
Die Programmausgabe bleibt die gleiche:
  E:\hiwi\temp>java TestABCmod
  A()
  B()


Quelltext: TestABCmod.java

d)

Konstruktoren werden nicht vererbt! Wenn die Zeile

  super(i);
nicht wäre, dann würde der Compiler meckern.

Grund: Wenn ein Objekt einer abgeleiteten Klasse instantiiert wird, dann ist ein Objekt der Oberklasse Attribut der Klasse selbst. Dieses Objekt will der Compiler instantiieren (ohne Argumente). Da es im zweiten Programm aber keinen Konstruktor ohne Argument gibt für A, kommt es zum Fehler. Das ist auch der Grund, wieso bei parametrisierten Konstruktoren immer super(...) auftaucht!