class X
{
y b=new y();
X(){
System.out.println("X");
}
}
class y{
y(){
System.out.println("y");
}
}
public class Z extends X {
  y y=new y();
  Z(){
  System.out.println("z");
  }
  public static void main(String[] args) {
new Z();
}
}

解决方案 »

  1.   

    结果:xz
    new Z()这个语句就是去执行Z的构造方法
    因为Z是X的子类,在Z的构造方法里会默认先调用其父类X的无参的构造方法,然后再执行自己的构造方法;因此得出结果xz
      

  2.   

    变量的声明在任何函数之前,包括构造函数之前。
    所以先执行main.main函数中new本身。
    有因为Z继承了X,所以就先执行X,又X中先new Y,所以跳转到Y中,-----输出Y
    再返回到X中,------输出X
    这样X执行完了,返回到子类Z中,先new Y,去执行Y---->输出Y
    再返回到Z中,最后输出Z记住一点:new对象会在任何函数包括构造函数之前执行(不过New在什么位置,都会优先执行)。
    你单步调试下就明白了
      

  3.   

    Java编程思想中的一句话可能对你有帮助。
    class中的初始化次序取决于class中变量的定义次序,变量定义可能散落各处,而且可能介于各种函数定义之间,但所有变量一定会在任何一个函数(甚至是构造函数)被调用之前完成初始化。
      

  4.   

    public class TEST extends X { 
      y y=new y(2); 
      TEST(){ 
      super(3);
      System.out.println("z"); 
      } 
      public static void main(String[] args) { 
       new TEST(); 

    } class X 

    y b=new y(3); 
    X(){ 
    System.out.println("X"); 

    X(int i){ 
    System.out.println("X"+i); 

    } class y{ 
    y(){ 
    System.out.println("y"); } y(int j){ 
    System.out.println("Y"+j); 
    } } 
    你这样运行下 就知道了··加了点参数
      

  5.   


    class X 

    y b=new y(); 
    X(){ 
    System.out.println("X"); 


    class y{ 
    y(){ 
    System.out.println("y"); 


    public class Z extends X { 
    private int i;
    y y=new y(); //是类变量
    Z(){ 
    System.out.println("z"); 

    public static void main(String[] args) { 
    Z testZ = new Z(); 
    System.out.println(testZ.i);
    /*
     * 1.创建对象时先调用构造方法,而构造方法对没有处理的类变量进行
     *   默认初始化。
     * 2.对子类初始化时,先调用父类构造方法,后调用子类构造方法
     * 所以输出:  y
         X
                         y
         z
     */

      

  6.   

    还有X和Z中定义的Y类实例也有构造函数哦!所以也会有输出的
      

  7.   

    myeclipse下你按F5,单步调试一下就知道了