子类实例化的调用顺序

对于一个下面一段代码
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#在调用构造函数之前就已经将对象初始化完毕了。

 

 

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值