# Vererbung



## Laren (18. Feb 2011)

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:

```
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. 


```
(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


----------



## maki (18. Feb 2011)

*verschoben*


----------



## Raziell (18. Feb 2011)

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.


----------



## Marco13 (18. Feb 2011)

Raziell hat gesagt.:


> In Java gibt es keine Mehrfachvererbung, das heisst du kannst eine Klasse nur einmal erben lassen (die automatische Object-Vererbung ausgeschlossen)



Der Teil in der Klammer ist überflüssig. Von einer Klasse erben, die schon von einer anderen erbt, ist ja nicht das, was man unter Mehrfachverwerbung versteht.


----------



## Raziell (18. Feb 2011)

> Der Teil in der Klammer ist überflüssig. Von einer Klasse erben, die schon von einer anderen erbt, ist ja nicht das, was man unter Mehrfachverwerbung versteht.



Stimmt natürlich


----------



## Laren (18. Feb 2011)

Raziell hat gesagt.:


> Prinzipiell gilt folgendes:
> 
> 
> Alle Klassen erben automatisch von Object.
> ...



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 (18. Feb 2011)

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.


```
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:


```
A b = new B();
b.m1();
b.m2();
b = new A();
b.m1();
b.m2();
```

Die richtige Ausgabe wäre

```
B.m1()
A.m2()
A.m1()
A.m2()
```


----------



## Raziell (18. Feb 2011)

> * Die Oberklasse kann von der Unterklasse nichts erben



Die Oberklasse erbt alle Methoden und Eigenschaften der Unterklasse die nicht private sind. 
Ein Oberklasse kann nicht von seiner Subklasse erben.



> * Man kann über die Oberklasse, Methoden von 2 Unterklassen untereinander "austauschen"



Verstehe nicht genau was du meinst.


----------



## xehpuk (18. Feb 2011)

Raziell hat gesagt.:


> 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.

```
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);
	}
}
```


```
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());
	}
}
```



Raziell hat gesagt.:


> 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.


----------



## Laren (18. Feb 2011)

Raziell hat gesagt.:


> Die Oberklasse erbt alle Methoden und Eigenschaften der Unterklasse die nicht private sind.
> Ein Oberklasse kann nicht von seiner Subklasse erben.
> 
> 
> ...



Sorry, jetzt bin ich komplett verwirt???:L
Was darf man denn bei dem Beispiel oben nicht machen, also wo stecken die Fehler?


----------



## Raziell (18. Feb 2011)

> 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:


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

}
```


```
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.


----------

