2010-05-18 13 views
5

Kürzlich ging ich das Vererbungskonzept durch.Vererbung in Java

Wie wir alle wissen, werden bei der Vererbung superclass Objekte vor subclass Objekte erstellt/initialisiert. Wenn wir also ein Objekt von subclass erstellen, enthält es alle Superklasseninformationen.

Aber ich steckte an einem Punkt fest.

Sind die Superklassen- und Unterklassenmethoden auf einem separaten Call-Stack vorhanden? Wenn es so ist, gibt es specific reason für das gleiche? Wenn nicht, warum erscheinen sie nicht auf demselben Call-Stack?

z.

// Superclass 
class A { 
    void play1() { 
     // .... 
    } 
} 

// Subclass 
class B extends A { 
    void play2() { 
     //..... 
    } 
} 

Dann wird die oben genannten 2 Methoden d.h play1() und play2() erscheinen auf separaten Call-Stack?

Danke.

+0

Haben Sie einen Grund zu denken, dass sie * möglicherweise * auf verschiedenen Stapeln sein könnten? Angesichts der Tatsache, dass die Oberklasse init unbedingt vollständig vor der Unterklasse init abgeschlossen sein muss, ist sie sowieso seriell, nein? – CPerkins

Antwort

2

Es besteht nicht unbedingt eine Beziehung zwischen einem Aufruf-Stack und einer Vererbung. Tatsächlich gibt es das häufig nicht. Wenn eine Superklassenmethode in einem Kind überschrieben wird, wird die Methode des Kinds aufgerufen - die Superklassenmethode wird überhaupt nicht ausgeführt, es sei denn, es gibt Code, um dies in der Kindmethode explizit auszuführen. Die Superklassenmethode wird in der Aufrufliste überhaupt nicht angezeigt - es sei denn, sie wird explizit von der Child-Methode aufgerufen.

class A { 
    void play1() { 
    //... 
    } 
    void play2() { 
    //.... 
    } 
} 
class B extends A { 
    void play1() { 
    //... 
    } 
} 
B b = new B(); 
b.play1(); // 'first' call 
b.play2(); // 'second' call 

A.play2() erscheint nur während des "zweiten Aufrufs" auf dem Aufruf-Stack. B.play1() erscheint nur während des "ersten Anrufs" im Anruf-Stack. A.play1() erscheint nie auf dem Aufruf-Stapel und wird nie ausgeführt.

+0

Ok! Sie wollen sagen, dass die Superklassenmethode nur dann auftritt, wenn sie explizit vom Unterklassenobjekt aufgerufen wird. –

2

Es gibt nur einen Aufruf-Stack pro Thread - also nein, beide playX Aufrufe geschehen auf dem gleichen Stapel.

Ich bin mir nicht sicher, warum Sie denken, sie würden nicht, oder was dies mit der Vererbung zu tun hat. Wenn Sie vielleicht ein konkretes Beispiel dafür nennen, warum Sie das für wichtig halten (d. H. Einen Fall, in dem sich das Verhalten merklich unterscheiden würde), könnte es hilfreich sein, ein vermutlich tieferes Problem anzugehen.