class A
{
public A()
{
printFields();
}

public void printFields()
{

}
}public class B extends A
{
int x=1;
int y;
public B()
{
y=-1;
}

public void printFields()
{
System.out.println("x="+x+",y="+y);
}

public static void main(String[] args)
{
new B();
}
}
//在eclipse中输出为x=0,y=0   为什么不是x=1,y=0?
//我把这个题改变成C#后,在vs2005中输出为x=1,y=0,我以前总以为java和C#是一样的,但现在看来好像不一样!
//改遍后的C#如下:
using System;
     class A
     {
          public A(){
                PrintFields();
           }
          public virtual void PrintFields(){}
      }
class B : A
{
    int x = 1;
    int y;
    public B()
    {
        y = -1;
    }
    public override void PrintFields()
    {
        Console.WriteLine("x={0},y={1}", x, y);
    }    public static void Main()
    {
        new B();
    }
}

解决方案 »

  1.   

    因为在B初始化时会先调用父类的构造函数,而这时B的属性x,y并没被赋值,所以它们都是默认的0
      

  2.   

    或许java与C#运行机制不一样吧,在类B初始化时先调用A的构造函数 PrintFields(); 而此时的PrintFields()执行的是B中的PrintFields()方法,此时java虚拟机只定义了两个变量x,y,还没有给其初始化.我没学过C#,只是猜测,希望会对你有点儿帮助...
      

  3.   

    一楼说的是没错。
    如果在class A修改成下面
    class A 

    public A() 

    printFields(); 
    } public void printFields() 

    System.out.println("a");

    }
    程序还是不会调用 classA的printFields() 而是classB的printFields()
    也就是说在构造父类时构造函数内部this是子类B的为什么啊?
      

  4.   

       因为在创建B类对象的时候,调用了B类构造器,但在调用构造器之前,JAVA先对B类内各成员变量进行
    初始化,在这个过程中,首先完成对基类的成员初始化然后才是B类自己的成员初始化,初始化过程中,
    无论你在成员变量处指定任何值,JAVA都会赋给各成员变量默认的初始值,对于数值类型就是0,对于
    引用就是NULL,所以初始化完毕,x=0,y=0
       然后再调用基类的构造器,但在A类的构造器中调用了printFields(),而B类也有一个printFields(),
    它覆盖了A类的printFields(),由于多态的原因,所以JAVA调用B类的printFields(),所以输出x=0,y=0。
    在从A类构造器返回到B类构造器的时候,情况有些改变,x值此时由0变成1,说明你在定义变量x时所赋的
    初值在此时起了作用,再次输出x=1,y=0。修改后的程序如下,只是在B的构造函数里增加了一条输出语句
    class A
    {
    public A()
    {
    printFields();
    } public void printFields()
    { }
    }public class B extends A
    {
    int x = 1;
    int y;
    public B()
    {
    System.out.println("x=" + x + ",y=" + y);
    y = -1;
    } public void printFields()
    {
    System.out.println("x=" + x + ",y=" + y);
    } public static void main(String[] args)
    {
    B b=new B();
    System.out.println("x="+b.x+",y="+b.y);
    }
    }