5

最近、私は継承の概念を経験しました。

ご存知のように、継承では、superclassオブジェクトはオブジェクトの前に作成/初期化されsubclassます。したがって、 のオブジェクトを作成するsubclassと、すべてのスーパークラス情報が含まれます。

しかし、私はある時点で立ち往生しました。

スーパークラスとサブクラスのメソッドは別々の呼び出しスタックに存在しますか? もしそうなら、specific reason同じものはありますか?そうでない場合、なぜ同じ呼び出しスタックに表示されないのですか?

例えば

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

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

次に、上記の 2 つのメソッド ieplay1( )play2( )は別のコール スタックに表示されますか?

ありがとう。

4

2 に答える 2

2

スレッドごとに呼び出しスタックは 1 つしかありません。つまり、両方のplayX呼び出しが同じスタックで発生します。

なぜそうしないと思うのか、またはこれが継承と何の関係があるのか​​ わかりません。これが重要であると考える理由の具体例 (つまり、動作が著しく異なる場合) を示すと、おそらくより深い問題に対処するのに役立つでしょう。

于 2010-05-18T15:46:40.373 に答える
2

コール スタックと継承の間には、必ずしも関係があるとは限りません。実際、ない場合が多いです。スーパークラス メソッドが子でオーバーライドされる場合、呼び出されるのは子のメソッドです。子メソッドで明示的にそれを行うコードがない限り、スーパークラス メソッドはまったく実行されません。スーパークラス メソッドは、子メソッドによって明示的に呼び出されない限り、コール スタックにはまったく表示されません。

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() は、「2 番目の呼び出し」の間のみコール スタックに表示されます。B.play1() は、「最初の呼び出し」の間のみコール スタックに表示されます。A.play1() がコール スタックに表示されることはなく、実行されることもありません。

于 2010-05-18T15:50:14.273 に答える