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();
}
}
{
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();
}
}
如果在class A修改成下面
class A
{
public A()
{
printFields();
} public void printFields()
{
System.out.println("a");
}
}
程序还是不会调用 classA的printFields() 而是classB的printFields()
也就是说在构造父类时构造函数内部this是子类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);
}
}