【问题标题】:Inheritance in JavaJava中的继承
【发布时间】:2011-02-20 23:18:25
【问题描述】:

最近我经历了继承的概念。

众所周知,在继承中,superclass 对象在 subclass 对象之前创建/初始化。所以如果我们创建一个subclass 的对象,它将包含所有超类信息。

但我一度陷入困境。

超类和子类方法是否存在于单独的调用堆栈中? 如果是这样,是否有任何 specific reason 相同? 如果不是这样,为什么它们没有出现在同一个调用堆栈上?

例如

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

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

那么上述两种方法,即play1( )play2( ) 是否出现在单独的调用堆栈上?

谢谢。

【问题讨论】:

  • 你有什么理由认为他们可能在不同的堆栈上?鉴于超类 init 肯定需要在子类 init 之前完全完成,无论如何它都是串行的,不是吗?

标签: java inheritance callstack


【解决方案1】:

调用堆栈和继承之间不一定有任何关系。事实上经常没有。如果在子方法中重写了超类方法,则调用的是子方法 - 根本不执行超类方法,除非有代码在子方法中显式执行此操作。超类方法根本不会出现在调用堆栈中 - 除非它被子方法显式调用。

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() 仅在“第二次调用”期间出现在调用堆栈中。 B.play1() 仅在“第一次调用”期间出现在调用堆栈上。 A.play1() 永远不会出现在调用堆栈上,也永远不会被执行。

【讨论】:

  • 好的!你的意思是说超类方法只有在被子类对象显式调用时才会出现。
【解决方案2】:

每个线程只有一个调用堆栈 - 所以不,两个 playX 调用都发生在同一个堆栈上。

我不确定你为什么认为他们不会,或者这与继承有什么关系。也许如果你给出一个具体的例子来说明你为什么认为这很重要(即行为会明显不同的情况),这将有助于解决可能是更深层次的问题。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2012-10-30
    • 2017-12-27
    • 2015-12-10
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-03-31
    相关资源
    最近更新 更多