对于一个下面一段代码
public class baseClass
{
public string a="baseClass"
public baseClass()
{
a="初始化baseClass";
}
}
public class ExtendClass:baseClass
{
private string b="ExtendClass";
public ExtendClass():base()
{
b="初始化ExtendClass";
}
}
baseClass a=new ExtendClass()
======C#的执行步骤:
1。private string b="ExtendClass";
2。public string a="baseClass" ;
3。 public baseClass()
{
a="初始化baseClass";
}
4。public ExtendClass():base()
{
b="初始化ExtendClass";
}
即:子类的属性或字段----->基类的属性或字段----->基类的构造函数----->子类的构造函数
=======JAVA的执行步骤:
1。public string a="baseClass" ;
2。private string b="ExtendClass";
3。public baseClass()
{
a="初始化baseClass";
}
4。public ExtendClass():base()
{
b="初始化ExtendClass";
}
即:基类的属性----->子类的属性----->基类的构造函数----->子类的构造函数
再来个此类面试题:
在下面的例子里
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);
}
当使用new B()创建B的实例时,产生什么输出?
执行过程如下:
1.int x=1;
int y;
···x=1,y=0;
2.public A(){
PrintFields();
}
由于虚函数的调用机制(见p.s.),这时调用的是B中的函数:
public override void PrintFields(){
Console.WriteLine("x={0},y={1}",x,y);
}
即输出x=1,y=0;
3.public B(){
y=-1;
}
p.s.
c#,和c++俩种语言在多态性的 实现机制 上面的细微差别。
C++:在基类的构造函数里面调用虚函数的话,会调用本类的不会调用派生类的,原因是基类构造的时候,虚表还没有被派生类继承和修改。
C#:那就不同了,在基类的构造函数里面照样调用派生类的。不知道有谁知道c#它的这种底层机制是怎样的?
-------是这样的,C++会先初始化基类,然后逐级初始化派生类型。C#则是一开始就把对象创建好了,然后逐个调用构造函数。本质区别在于:C++的构造函数的任务是初始化,C#则不然,C#的类型的任何字段不必初始化,均有默认值,所以C#在调用构造函数之前就已经将对象初始化完毕了。