Vererbung

Laren

Bekanntes Mitglied
Hi,

Ich schreibe am Montag eine Klausur in Java und hab noch Probleme mit der Vererbung
Es kommt mit hoher Wahrscheinlichkeit solch eine Aufgabe

Gegeben sei die folegende Klassenhierarchie:
Java:
public abstract class Top { 
    public Top(int a) { 
        System. out .println("Top: Konstruktor " + a); 
        this.a = a; 
    } 

    public abstract void compute(); 

    public void print() { 
        System. out .println("Top.print() a=" + a); 
    } 

    public void f(Top arg){ 
        System. out .println("Top.f() arg = " + arg); 
    }

    public String toString() { 
        return "Top: a = " + a; 
    } 
    protected int a; 
} 

public class Middle extends Top { 
    public Middle(int b) { 
        super(b/2); 
        this.b = b; 
        System. out .println("Middle: Konstruktor " + b); 

    } 
    public Middle (Middle arg) { 
        this(arg.b); 

    } 
    public void compute() { 
        System. out .println("Middle.compute() " + (a + b)); 

    } 
    public void method() { 
        System. out .println("Middle.method()")
        ; 
    } 
    public String toString() { 
        return "Middle: b = " + b; 
    } 

    protected int b; 
} 

public class Bottom extends Middle { 
    public Bottom(double c) { 
        super((int)(c/2)); 
        System. out .println("Bottom: Konstruktor " + c); 
        this.c =
        c; 
    } 
    public void compute() { 
        System. out .println("Bottom.compute() " + (a + b +
                c)); 
    } 
    public void method() { 
        System. out .println("Bottom.meth
            od()"); 
    } 
    public void print() { 
        System. out .println("Bottom.print() a=" 
            + a + ", b=" + b + ", 
            c=" + c); 
    } 
    public String toString() { 
        return "Bottom: c = " + c; 
    } 

    private double c; 
}

Untersuchen Sie die folgenden Methoden einer Testklasse auf ihre Korrektheit. Im Fehlerfalle erläutern Sie
kurz den Fehler. Für alle richtigen Anweisungen geben Sie bitte jeweils an, was ausgegeben wird.

Java:
(a) public void a() { 
    Top t1 = new Bottom(9.5); 
    t1.compute(); 
    t1.print(); 
    t1.method();  
    Bottom b1 = (Bottom)t1;  
    b1.compute(); 
    b1.print(); 
    b1.method(); 
} 
(b) public void b() { 
    Bottom b1 = new Bottom(7.5); 
    b1.compute(); 
    b1.print(); 
    Middle m1 = new Middle(b1); 
    m1.compute(); 
    m1.print(); 
    m1.f(b1); 
} 
(c)  public void c() { 
    Top t1 = new Top(10); 
    t1.compute(); 
    t1.print(); 
    t1.f(t1); 
 
} 
(d) public void d() { 
    Middle m1 = new Middle(5); 
    Top t1 = m1; 
    t1.compute(); 
    t1.print(); 
    t1.f(m1); 
}


Was mir Problem bei der Aufgabe macht, ist, dass ich nicht immer genau weis, ob das erben funktioniert(und das ist ja wohl die Kernaufgabe^^)
Gibt es vielleicht so eine Art Liste, was beim Vererben funktioniert und was nicht, so etwas alá "Unterklasse erbt von Oberklasse, aber umgekeht ist das nicht möglich"...

Viele Grüße
 

Raziell

Bekanntes Mitglied
Prinzipiell gilt folgendes:

  • Alle Klassen erben automatisch von Object.
  • Alle Klassen können durch extends von einer anderen Klasse erben und diese ggf. erweitern.
  • In Java gibt es keine Mehrfachvererbung, das heisst du kannst eine Klasse nur einmal erben lassen (die automatische Object-Vererbung ausgeschlossen)
  • Die erbende Klasse wird zur Unter- oder Subklasse beziehungsweise Kindklasse.
  • Die Klasse, von der die Unterklasse erbt, heißt Oberklasse (auch Superklasse).
  • Durch Vererbung werden alle Eigenschaften der Oberklasse auf die Unterklasse übertragen.
 

Laren

Bekanntes Mitglied
Prinzipiell gilt folgendes:

  • Alle Klassen erben automatisch von Object.
  • Alle Klassen können durch extends von einer anderen Klasse erben und diese ggf. erweitern.
  • In Java gibt es keine Mehrfachvererbung, das heisst du kannst eine Klasse nur einmal erben lassen (die automatische Object-Vererbung ausgeschlossen)
  • Die erbende Klasse wird zur Unter- oder Subklasse beziehungsweise Kindklasse.
  • Die Klasse, von der die Unterklasse erbt, heißt Oberklasse (auch Superklasse).
  • Durch Vererbung werden alle Eigenschaften der Oberklasse auf die Unterklasse übertragen.

Die Theorie an sich ist mir ja schon klar, aber es gibt da ja noch weitere Punkte wie:
  • Die Oberklasse kann von der Unterklasse nichts erben
  • Man kann über die Oberklasse, Methoden von 2 Unterklassen untereinander "austauschen"
Ich meine so die etwas tieferen Spielregeln(ich hoffe ihr wisst was ich meine).

Grüße
 

kirax

Bekanntes Mitglied
Es gibt noch Interfaces.
Eine Klasse kann mehrere Interfaces implementieren (damit kann man von hinten durch die Brust ins Auge auch mehrfach erben).

Dann gibt es noch die sog. dynamische Bindung.
Methoden in JAVA sind dynamisch gebunden. Das bedeutet, dass zur Laufzeit bei überschriebenen Methoden immer die Methode aus der Vererbungsreihe genommen wird, die am ehesten zum Objekt passt.

Java:
class A {
  public void m1() {
    System.out.println("A.m1()");
  }
  public void m2() {
    System.out.println("A.m2()");
  }
}

class B extends A {
  public void m1() {
    System.out.println("B.m1()");
  }
}

Die Fragestellung dazu wäre, welche Ausgabe bei folgendem Code zu erwarten ist:

Java:
A b = new B();
b.m1();
b.m2();
b = new A();
b.m1();
b.m2();

Die richtige Ausgabe wäre
Code:
B.m1()
A.m2()
A.m1()
A.m2()
 
Zuletzt bearbeitet:

xehpuk

Top Contributor
Die Oberklasse erbt alle Methoden und Eigenschaften der Unterklasse die nicht private sind.
Das stimmt nur bedingt. Sie werden schon vererbt, nur kann man nicht direkt auf sie zugreifen.
Java:
public class Sup {
	private int id;
	
	public int getId() {
		return id;
	}
	
	private void setId(final int id) {
		this.id = id;
	}
	
	protected void leet() {
		setId(1337);
	}
}
Java:
public class Sub extends Sup {
	public static void main(String[] args) {
		final Sub sub = new Sub();
		System.out.println(sub.getId());
		sub.leet();
		System.out.println(sub.getId());
	}
}
Verstehe nicht genau was du meinst.
Damit ist wohl einfach die Polymorphie gemeint. Je nachdem, welchen konkreten Typ das Objekt hat, wird eine andere Methode zur in der Superklasse deklarierten Operation ausgeführt.
 

Raziell

Bekanntes Mitglied
Das stimmt nur bedingt. Sie werden schon vererbt, nur kann man nicht direkt auf sie zugreifen.

Jop stimmt mein Fehler.

Ein Oberklasse kann nicht von seiner Subklasse erben.

Geht nicht, der Compiler wird nicht compilieren:

Java:
public class A extends B {
	
	public static void main(String[] args) {
		new A();
	}
	
	public A() {
		System.out.println("A");
	}

}

Java:
public class B extends A {
	
	public B() {
		System.out.println("B");
	}

}

eclipse meldet "The hierarchy of the type A is inconsistent".

Um auf den von dir geposteten Code zurückzukommen, hast du es denn schonmal abgetippt und durchgetestet? Wenn nein wäre das der erste Schritt.
 

Neue Themen


Oben