继承类实例化时构造函数的执行顺序

     最近准备去面试一个实习工作,看了一下<C#入门经典(第三版)>,看到那个构造函数的执行序列(原书176页)就动手试了一下,结果发现了一个问题

    以下摘自书中


 考虑下面的对象结构

ContractedBlock.gif ExpandedBlockStart.gif Code
 public class MyBaseClass
    {
        
public MyBaseClass()
        {
        }
        
public MyBaseClass(int i)
        {
        }
    }

    
public class MyDerivedClass:MyBaseClass
    {
        
public MyDerivedClass(){}
        
public MyDerivedClass(int i)
        {
        }
        
public MyDerivedClass(int i,int j)
        {
        }
    }

     如果以下面的方式实例化MyDerivedClass

      MyDerivedClass myObj=new MyDerivedClass();

      则事件的顺序如下

      1.执行System.Object.Object()构造函数;

      2.执行MyBaseClass.MyBaseClass()构造函数;

      3.执行MyDerivedClass.MyDerivedClass()构造函数;

 

     如果以下面的方式实例化MyDerivedClass

      MyDerivedClass myObj=new MyDerivedClass(4);

      则事件的顺序如下

      1.执行System.Object.Object()构造函数;

      2.执行MyBaseClass.MyBaseClass(int i)构造函数;

      3.执行MyDerivedClass.MyDerivedClass(int i)构造函数;


     如果以下面的方式实例化MyDerivedClass

      MyDerivedClass myObj=new MyDerivedClass(4,8);

      则事件的顺序如下

      1.执行System.Object.Object()构造函数;

      2.执行MyBaseClass.MyBaseClass()构造函数;

      3.执行MyDerivedClass.MyDerivedClass(int i, int j)构造函数;

 

     注意上面的红色部分,为什么会这样执行呢,我自己做了一下实验,发现不是这样执行的

     事件的顺序如下

      1.执行System.Object.Object()构造函数;

      2.执行MyBaseClass.MyBaseClass()构造函数;

      3.执行MyDerivedClass.MyDerivedClass(int i)构造函数;

     看看我的代码(用vs2008,为了排除是不是由于.net 3.5的原因,我特意换vs05又试了一遍)

 

ContractedBlock.gif ExpandedBlockStart.gif Code
    class Program
    {
        
static void Main(string[] args)
        {
            MainClass m1 
= new MainClass();
            Console.WriteLine();
            MainClass m2 
= new MainClass(1);
            Console.WriteLine();
            MainClass m3 
= new MainClass(13);
            Console.ReadLine();
        }
    }
    
public class Base
    {
        
public Base()
        {
            Console.WriteLine(
"执行Base类的无参数构造函数");
        }
        
public Base(int i)
        {
            Console.WriteLine(
"执行Base类的一个int参数的构造函数");
        }
    }
    
public class MainClass : Base
    {
        
public MainClass() { }

        
public MainClass(int i)
        {
            Console.WriteLine(
"执行一个参数int构造函数");
        }

        
public MainClass(int i, int j)
        {
            Console.WriteLine(
"执行两个int参数");
        }
    }

 

执行结果截图

 

 

看来应该是书上的印刷错误了,莫非还有什么其他的原因?

 

PS:顺便再记一下可以改变实例化执行的构造函数的两个关键字,base,this,用法也很简单,就在构造函数方法签名后面加":base(int i)"这样类似的语句,就会去执行它父类中有相同签名的构造函数.

转载于:https://www.cnblogs.com/zhangyue/archive/2008/08/21/1272659.html

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值