Hallo!
Hier zunächst nochmal die Frage konkreter:
- Wir haben eine Klasse B gegeben durch "class B extends A". Dabei überschreibt B die Methoden von A, darunter statische und nicht-statische.
- Nun erzeugen wir irgendwo außerhalb ein Objekt x mit "A x = new B()" oder auch alternativ "A x = (A) b" für ein existierendes B-Objekt b.
- Dann führt das dazu, dass Aufrufe "x.methodenname()" nur dann die Methode aus B aufrufen, wenn die Methode nicht statisch ist, aber die aus A, wenn sie statisch ist !!
Frage: Warum dieses verschiedene Verhalten ???
Ich hatte eigentlich gelernt:
"Ein B-Objekt bleibt immer ein B-Objekt, auch wenn es gecastet wird. Das zeigt sich daran, dass getClass immer B zurückliefert."
Hier ein Beispiel:
Hier zunächst nochmal die Frage konkreter:
- Wir haben eine Klasse B gegeben durch "class B extends A". Dabei überschreibt B die Methoden von A, darunter statische und nicht-statische.
- Nun erzeugen wir irgendwo außerhalb ein Objekt x mit "A x = new B()" oder auch alternativ "A x = (A) b" für ein existierendes B-Objekt b.
- Dann führt das dazu, dass Aufrufe "x.methodenname()" nur dann die Methode aus B aufrufen, wenn die Methode nicht statisch ist, aber die aus A, wenn sie statisch ist !!
Frage: Warum dieses verschiedene Verhalten ???
Ich hatte eigentlich gelernt:
"Ein B-Objekt bleibt immer ein B-Objekt, auch wenn es gecastet wird. Das zeigt sich daran, dass getClass immer B zurückliefert."
Hier ein Beispiel:
Code:
class OverLoadTest
{
public static void main (String [] args)
{
A a = new A();
a.m(); // liefert 'A'
a.n(); // liefert 'A'
B b = new B();
b.m(); // liefert 'B'
b.n(); // liefert 'B'
A a2 = new B();
a2.m(); // liefert 'A' WARUM ? Warum nicht einheitlich ?
a2.n(); // liefert 'B' WARUM ? Warum nicht einheitlich ?
A a3 = (A) b;
a3.m(); // liefert 'A' WARUM ? Warum nicht einheitlich ?
a3.n(); // liefert 'B' WARUM ? Warum nicht einheitlich ?
}
}
class A
{
public static void m ()
{
System.out.println("A");
}
public void n ()
{
System.out.println("A");
}
}
class B extends A
{
public static void m ()
{
System.out.println("B");
}
public void n ()
{
System.out.println("B");
}
}