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()哪位懂的大虾请指点下,谢谢了

解决方案 »

  1.   

    你在main函数里是new一个Derived对象,而不是Base对象,根据java的运行时绑定原理,肯定是调用子类的方法嘛
      

  2.   

    因为 真实的对象是 Derived 对象
    在的二种方式的父类里 
    class Base{ 
     Base(){ 
      print(); 

    调用print();方法是 实际上 是用 this.print();
    而 this会指向将来的调用者对象
     Derived d=new Derived(); 
    也就等同于 d.print();
    所以会调到 子类的 print();  并不是多态.
      

  3.   

    创建派生类对象时先调基类构造函数,而print()被override了,所以调用派生类的print()。
      

  4.   

    http://topic.csdn.net/u/20080402/21/6e9dc1dc-6ae5-4f41-a331-bbc74eb5b465.html
    看这个帖啊,一样的