class A{
   int i;
   A(){
      System.out.print("A"); 
   }
}
class B extends A{
   int j;
   B(){
     System.out.print("B");
   }
}
对于以上的简单代码段,当使用new B()构造B的对象时,会先构造A的对象,通过先初始化i,然后在调用A的构造方法,然后在初始化j,调用B的构造方法,但是
new B();语句的执行入口在哪?即当java执行到这句指令时是怎么处理的?是先进入B的构造方法,通过调用super()开始构造A,还是其他的途径?此外,B()的第一句super()或者super(参数)只是简单的通知编译器构造A对象时用A中的哪个构造方法嘛?
有点困惑,请知道的朋友赐教,谢谢

解决方案 »

  1.   

    我猜测的过程如下:
    new B();
    第一步:jvm就会根据类B的定义即(extends)寻找其父类,而不是先寻找其构造函数。因为如果你在类A中有静态初始域的话,发会发现这个域内的代码先于A的构造函数与B的构造函数执行。
    第二步:jvm才是调用父类A的构造函数
    第三步:调用子类自己的构造函数具体情况楼主可以找《深入java虚拟机》这本书看看,听说这本书上应该有讲。示例:
    class A
    {
    static
    {
    System.out.println("A的静态初始域");
    }

    A()
    {
    System.out.println("A");
        }
    }class B extends A
    {
    B()
    {
    System.out.println("B");
    }
    }public class Test
    {
        public static void main(String[] args)
    {
    new B();
    }
    }结果:
    A的静态初始域
    A
    B
      

  2.   

    个人理解:
    应该先加载class A,初始化A的静态成员数据和静态初始域;再加载class B,初始化A的静态成员数据和静态初始域。接着初始化class A的非静态数据为默认值,执行class A的构造器;然后初始化class B的非静态数据为默认值,执行class B的构造器。