其实就是第一个输出有点不懂,不过经过单步调试后发现,在B b=new B();中编译器先寻找
class B的构造函数,没找到,由于B 是继承与A,所以编译器便以A 的构造函数作为默认的构造函数了,所以调用print(),即B自己的print(),输出bbb
A a=new A();是很明显的,调用A的print(),输出aaa
a.print();a是A的一个实例,也调用A的print(),输出aaa
a=b;
a.print();前一句使a指向b,因为A是B的超类,所以可以这么赋值,即a指向b,所以a.print()访问b的print(),输出bbb
最后一个类似

解决方案 »

  1.   

    初始化是从基础类开始,然后依衍生类继承的顺序逐个执行构造函数
    Thinking in JAVA的第六章末尾有比较详细的解答,值得一看
      

  2.   

    天哪,这个有什么问题吗?
    第一个 b=new B() 调用本身的print 当然是bbb
    第二个 a=new A() 调用A的构造函数 当然是aaa
    第三个 a.print   调用A的print函数 当然是aaa
    第四个 a=b 了,所以a.print 和 b.print 打印出来的当然是 bbb bbb
    所以
     bbb
     aaa
     aaa
     bbb
     bbb ,拜托,看问题仔细点?OK
      

  3.   

    照bsd的说法,岂不是每个子类构造时要把父类,父类的超类的构造函数全部执行一遍???
      

  4.   

    就是啊,以前我也是以为是bsd的说法,可是执行后为什么不是啊?
      

  5.   

    [...经过单步调试后发现,在B b=new B();中编译器先寻找
    class B的构造函数,没找到,由于B 是继承与A,所以编译器便以A 
    的构造函数作为默认的构造函数了,所以调用print(),
    即B自己的print(),输出bbb]这个我认为不太准确:
     - A的构造器被调用的原因不是因为B没有写构造器,无论B写没写构造器,A的
       某个构造器都要调用,因为A是B的父类
     - B中如果没有显式地写构造函数的话,则编译器为其自动添加“null 构造器”,
       即无参数构造器
     - 第一个bbb的原因是因为override[照bsd的说法,岂不是每个子类构造时要把父类,父类的超类的构造函数
    全部执行一遍??? ]是的,TIJ里有介绍
      

  6.   

    不可能每个子类构造时要要把父类等构造函数全部执行一遍
    看看这个程序好了class C
    {
    public C()
    {
      print();
      }
      public void print()
      {
      System.out.println("ccc");
      }
      }class A extends C
    {
    public A()
      {
        print();
      }
    public void print()
    {
        System.out.println("aaa");
    }
    }class B extends A
    {
      public void print()
      {
        System.out.println("bbb");
      }
    }public class mytest
    {
      public mytest()
      {
      }
      public static void main(String[] args)
      {
       A a=new A();
      }
    }照上面的观点,打印出来的岂不是ccc aaa,但结果就是aaa
      

  7.   

    我又仔细试了一次,现在我同意bsd的观点了,谢谢!
      

  8.   

    对,我刚才也把你的代码运行了一遍,结果是;
    aaa
    aaa第一个aaa是C构造器+override造成的,第二个aaa是A构造器造成的,
    所以确实是所有父类的构造器都要调用的(包括java.lang.Object)
      

  9.   

    不过我想问一下:JAVA中有没有虚函数这个概念?
      

  10.   

    Java中可以在父类中定义一个abstract方法,这个和虚函数很象
    另外,Java中在interface中定义的方法,全都是public abstract的
      

  11.   

    这个程序在C++中运行,得到的就是ccc,aaa,可见java中的函数都是默认都是虚函数
      

  12.   

    请看这个
    http://www.csdn.net/expert/topic/390/390404.shtm