C#构造函数的执行顺序

<1>

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;

namespace 构造函数的执行顺序
{
    public class MyBaseClass
    {
        public MyBaseClass()
        {
            Console.Write("调用父类无参数的构造函数");
        }

        public MyBaseClass(int i)
        {
            Console.Write("调用父类一个参数的构造函数");
        }
    }

    public class MyDerivedClass : MyBaseClass
    {
        public int age;
        public static int age2;//只要类里存在静态变量。那么静态变量总是最先初始化的。

        static MyDerivedClass() //既然要初始化静态变量,就要调用静态的构造函数。
        {
            age2 = 100;
            Console.Write(age2);

        }

        public MyDerivedClass():this(5)
        {
            age = 101;
            Console.WriteLine(age);
        }

        public MyDerivedClass(int i)
        {
            age = 102;
            Console.WriteLine(age);
        }

        public MyDerivedClass(int i, int j)
        {
            Console.WriteLine("两个变量的参数");
        }
    }
    class Program
    {
        static void Main(string[] args)
        {
            MyDerivedClass myder = new MyDerivedClass(); //输出100 ,"调用父类无参数的构造函数",101
            //执行顺序:<1>: static MyDerivedClass() <2>: public MyBaseClass() <3>:public MyDerivedClass()

            //---------------------------------------------------------------------------------------------

            MyDerivedClass myder2 = new MyDerivedClass(5); //输出"调用父类无参数的构造函数",102。

            //在初始化myder对象的时候已经初始化过静态变量age2了。因为静态构造函数最多执行一次,所以初始化myder2对象的时候就不会在继续初始化静态变量age2了
            //执行顺序:<1>: public MyBaseClass() <2>: public MyDerivedClass(int i)

            //假如我想在初始化myder2对象的时候调用父类带有一个参数的构造函数怎么办呢?很好办只要在派生类的构造函数后面加一个:base(i)
            /*     base 关键字用于从派生类中访问基类的成员;指定创建派生类实例时应调用的基类构造函数。

                     public MyDerivedClass(int i):base(i)
                     {
                        age = 102;
                        Console.WriteLine(age);
                     }

                    执行顺序:<1>: public MyBaseClass(int i) <2>: public MyDerivedClass(int i)
                    顾这里输出的是 "调用父类一个参数的构造函数",102
             */

            //---------------------------------------------------------------------------------------------

            MyDerivedClass myder3 = new MyDerivedClass(5, 6); //输出"调用父类无参数的构造函数","两个变量的参数"

            //执行顺序:<1>: public MyBaseClass() <2>: public MyDerivedClass(int i, int j)

            Console.ReadKey();
        }
    }
}

<2>

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;

namespace 构造函数的执行顺序
{
    public class MyBaseClass
    {
        public MyBaseClass()
        {
            Console.Write("调用父类无参数的构造函数");
        }

        public MyBaseClass(int x)
        {
            Console.Write("调用父类一个参数的构造函数");
        }
    }

    public class MyDerivedClass : MyBaseClass
    {
        public int age;
        public static int age2;//只要类里存在静态变量。那么静态变量总是最先初始化的。

        static MyDerivedClass() //既然要初始化静态变量,就要调用静态的构造函数。
        {
            age2 = 100;
            Console.Write(age2);

        }

        public MyDerivedClass():this(5)
        {
            age = 101;
            Console.WriteLine(age);
        }

        public MyDerivedClass(int i):base(i)
        {
            age = 102;
            Console.WriteLine(age);
        }

        public MyDerivedClass(int i, int j)
        {
            Console.WriteLine("两个变量的参数");
        }
    }
    class Program
    {
        static void Main(string[] args)
        {
            MyDerivedClass myder = new MyDerivedClass(); //输出100 ,"调用父类一个参数的构造函数",102,101
            //执行顺序:<1>: static MyDerivedClass() <2>:  public MyBaseClass(int x) <3>:public MyDerivedClass(int i) <4>:public MyDerivedClass()

            //---------------------------------------------------------------------------------------------

            //MyDerivedClass myder2 = new MyDerivedClass(5); //输出"调用父类无参数的构造函数",102。

            //在初始化myder对象的时候已经初始化过静态变量age2了。因为静态构造函数最多执行一次,所以初始化myder2对象的时候就不会在继续初始化静态变量age2了
            //执行顺序:<1>: public MyBaseClass() <2>: public MyDerivedClass(int i)

            //假如我想在初始化myder2对象的时候调用父类带有一个参数的构造函数怎么办呢?很好办只要在派生类的构造-+函数后面加一个:base(i)
            /*     base 关键字用于从派生类中访问基类的成员;指定创建派生类实例时应调用的基类构造函数。

                     public MyDerivedClass(int i):base(i)
                     {
                        age = 102;
                        Console.WriteLine(age);
                     }

                    执行顺序:<1>: public MyBaseClass(int i) <2>: public MyDerivedClass(int i)
                    顾这里输出的是 "调用父类一个参数的构造函数",102
             */

            //---------------------------------------------------------------------------------------------

            //MyDerivedClass myder3 = new MyDerivedClass(5, 6); //输出"调用父类无参数的构造函数","两个变量的参数"

            //执行顺序:<1>: public MyBaseClass() <2>: public MyDerivedClass(int i, int j)

            Console.ReadKey();
        }
    }
}
时间: 2024-10-23 06:43:57

C#构造函数的执行顺序的相关文章

Java的初始化块、静态初始化块、构造函数的执行顺序及用途探究

随笔- 40  文章- 0  评论- 1 Java的初始化块.静态初始化块.构造函数的执行顺序及用途探究 Java与C++有一个不同之处在于,Java不但有构造函数,还有一个”初始化块“(Initialization Block)的概念.下面探究一下它的执行顺序与可能的用途. 执行顺序 首先定义A, B, C三个类用作测试,其中B继承了A,C又继承了B,并分别给它们加上静态初始化块.非静态初始化块和构造函数,里面都是一句简单的输出. 主类Main里面也如法炮制. 1 class A { 2 st

继承构造函数的执行顺序

转自:http://blog.csdn.net/daheiantian/article/details/6438782 Code: #include <iostream> using namespace std; class A { public: A() { cout<<"int A::A()"<<endl; } A(A &a) { cout<<"int A::A(A &a)"<<endl

关于子类对象的构造函数和父类构造函数的执行顺序

我们分别为父类和子类添加显式的构造函数,代码如下: class Person     {         private int nAge;         protected string strName;         double douHeight;         public string strEateType;         //父类的构造函数         public Person()         {             Console.WriteLine("我

父类,子类,静态属性,静态代码块,构造代码块,构造函数,执行顺序

1 package demo; 2 //父类 3 public class FatherClass { 4 5 private static String strFather="父类静态属性----1"; 6 7 static{ 8 System.out.println("父类静态代码块----1"); 9 } 10 11 { 12 System.out.println("父类构造代码块----3"); 13 } 14 15 public Fat

java变量,初始化快,构造函数的执行顺序

转自 http://blog.csdn.net/macheng365/article/details/6403050 —————————————————————————————————————————————————— 对于JAVA中类的初始化是一个很基础的问题,其中的一些问题也是易被学习者所忽略.当在编写代码的时候碰到时,常被这些问题引发的错误,感觉莫名其妙.而且现在许多大公司的面试题,对于这方面的考查也是屡试不爽.不管基于什么原因,我认为,对于java类中的初始化问题,有必要深入的了解.Ja

JavaSE8基础 类中代码块与构造函数的执行顺序 静态代码块(only) -&gt; 构造代码块 -&gt; 构造方法

os :windows7 x64    jdk:jdk-8u131-windows-x64    ide:Eclipse Oxygen Release (4.7.0) 代码: /* 静态代码块(only) -> 构造代码块 -> 构造方法 */ class Test { static{ //静态代码块中 System.out.println("静态代码块的代码执行,只执行一次"); } { System.out.println("构造代码块中的代码执行"

静态代码块,普通代码块,构造函数的执行顺序

class Father{ public Father(){ System.out.println("...父类的构造方法..."); } static{ System.out.println("...父类的静态代码块..."); } { System.out.println("...父类的普通代码块..."); } } class Son extends Father{ public Son(){ System.out.println(&quo

Java类静态属性、静态块、非静态属性、非静态块、构造函数在初始化时的执行顺序

前言 今天在看Android ContentProvider实现的时候,突然想到了Java类在new的过程中,静态域.静态块.非静态域.非静态块.构造函数的执行顺序问题.其实这是一个很经典的问题,非常考察对Java基础知识的掌握程度.很多面试过程中相信也有这样的问题,趁着周末有时间复习一下. 结论 这里先把整理好的结论抛给大家,然后我在写个程序来验证我们的结论.在Java类被new的过程中,执行顺序如下: 实现自身的静态属性和静态代码块.(根据代码出现的顺序决定谁先执行) 实现自身的非静态属性和

Java静态代码块、代码块及构造函数执行顺序

根据以下程序进行分析 定义一个父类 package sas.LearnJava; public class ExcuteOrderTest { { System.out.println("我是在父类开始的普通代码块!"); } public ExcuteOrderTest() { System.out.println("我是父类的无参构造函数!"); } public void showSomething() { System.out.println("我