回 帖 发 新 帖 刷新版面

主题:求助 java初始化的问题

package Test13;
abstract class Base{
    Base(){
      print();
    }
  abstract void print();
}
class Derived extends Base{
  int i=11;
  void print(){
      System.out.println("The Derived i:"+i);
  }
}
class Test13{
  public static void main(String[] args)
  {
      Derived d=new Derived();
      d.print();
  }
}
输出的是
The Derived i:0
The Derived i:11
这个我理解,因为在Base类中Print()是抽象方法,Base的构造函数print()就唤醒了子类中Derived的print()方法

但是为什么这么写也和上面得到的结果一样了:
package Test13;
class Base{
  Base(){
      print();
    }
  void print(){
    system.out.println("This is Base Print()");
  }
}
class Derived extends Base{
  int i=11;
  void print(){
      System.out.println("The Derived i:"+i);
  }
}
class Test13{
  public static void main(String[] args)
  {
      Derived d=new Derived();
      d.print();
  }
}
输出的是
The Derived i:0
The Derived i:11


而不是:
This is Base Print()
The Derived i:11

这是为什么了,那个Base类中明明有一个print()为什么不调用
反去调用Derived()

哪位懂的大虾请指点下,谢谢了[em1]

回复列表 (共3个回复)

沙发

我觉得你的理解有点错误。“在Base类中Print()是抽象方法,Base的构造函数print()就唤醒了子类中Derived的print()方法”这个说法是不正确的。并不是因为父类中的print是抽象的,所以才调用子类的方法。
这里涉及到面向对象的一个基本特征:多态。子类在调用自己的构造函数的时候首先调用父类的。所以在运行Derived d=new Derived();这一句的时候,会首先调用父类的构造方法。这时调用print方法。由于多态机制,这个print方法会执行子类定义的实现代码,而不是父类的。注意此时,子类的构造函数还没有执行,也就是说,并没有构造子类对象,所以那个i是0,因此第一句会打印出The Derived i:0。然后d.print();其实是在构造方法之外的,此时构造方法执行完了,子类对象也成功构造,i就有值了,因此打印出The Derived i:11

板凳

《thinking in java》 page163
构造函数调用多太函数的行为!
我也才学,刚看到这!

3 楼


[em1]谢谢,明白了,呵呵

我来回复

您尚未登录,请登录后再回复。点此登录或注册