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

    以下摘自书中


 考虑下面的对象结构

 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又试了一遍)

 

 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)"这样类似的语句,就会去执行它父类中有相同签名的构造函数.

相关文章:

  • 2022-01-29
  • 2018-06-05
  • 2022-12-23
  • 2021-10-26
  • 2022-12-23
  • 2021-11-23
  • 2022-12-23
猜你喜欢
  • 2022-12-23
  • 2022-12-23
  • 2022-12-23
  • 2021-10-06
  • 2018-09-11
  • 2022-12-23
  • 2022-12-23
相关资源
相似解决方案