Manager()-->Component()-->Manager.startUp(..).在调Component()时,会给一个this指针,该指针指向Manager,所以Component()的this.startUp()实际就是Manger的startUp().这是一般的OO概念,一般书上都有的.你可以在两个startUp()中加上打印语句验证一下.

解决方案 »

  1.   

    楼上说的不对吧,无论是从java本身原理上,还是实践上(刚才我验证过)
    )基类的构造函数应该先调用.所以还得从其它方面着想.
      

  2.   

    而且,在派生类的构造函数调用之前, 派生类的startUp()函数被调用.刚才我验证了.
    很怪!!!!
      

  3.   

    怎么会不对呢,害得我又自我怀疑了一次,下面的程序会说明问题:
    class Base {
       Base() {
          System.out.println("Base");
          method();
       }
       void method() {
          System.out.println("Base method");
       }
    }class Child extends Base {
       Child() {
          System.out.println("Child");
       }
       void method() {
          System.out.println("Child method");
       }
       public static void main(String[] args) {
          new Child();
       }
    }
    结果:
    Base
    Child method
    Child如果把下边的method()去掉,结果:
    Base
    Base method
    Child
      

  4.   

    to cxjlw(老为):
    在派生类的构造函数调用之前, 派生类的startUp()函数被调用===>我也是这意思,一点不怪啊.应该说是先调用派生类的构造函数A,但在执行A之前,须调用基类的构造函数B,等到B执行完了,再执行A的内容.
      

  5.   

    从你最后一个实例程序来看,是不是我可以这样理解:如果在派生类中有超类的覆盖方法,那么在实例化派生类对象调用超类的构造器时,会传入你所实例化对象的一个this指针,这时调用的就是派生类对象中的方法,而如果在派生类中没有这个覆盖方法的话,由于超类中的方法被继承到了派生类中,所以调用也不会有任何的问题。这时就调用超类中的方法了。
    我其实觉得这里的关键是不是就在于看你实例化的对象是什么,而且在对象的一次实例化过程中,所调用的任何方法前始终都会加上this关键字,即使是在它的超类中。
    我的这样理解应该是对的把!
    谢谢,HelpAll了,记得我以前也曾经得到你的多次帮助,太感谢了!!!
      

  6.   

    不错,你的理解应该是对的!也不一定就死记this,
    我觉的是只要是子类中有的方法,那它就覆盖超类(父)中的方法!而调用子类中的,不就完了吗?
      

  7.   

    我有一点不明白,大家别笑话我啊
    void startUp()不是构造函数,为什么也被调用了???