C#与Java实例化对象时的差异(2)

class BaseC : BaseB
    {
        private Print p = new Print("实例变量C");
        private static Print p1 = new Print("静态变量C");

static BaseC()
        {
            Console.WriteLine("静态构造方法C");
        }

public BaseC()
        {
            Console.WriteLine("构造方法C");
        }
        public new void Invoke()
        {
            Console.WriteLine("Invoke---BaseC");
        }
    }

class Program
    {
        static void Main(string[] args)
        {
            BaseC bc = new BaseC();
            bc.Invoke();
        }
    }
}

测试信息---静态变量C
静态构造方法C
测试信息---实例变量C
测试信息---静态变量B
静态构造方法B
测试信息---实例变量B
测试信息---静态变量A
静态构造方法A
测试信息---实例变量A
构造方法A
构造方法B
构造方法C
Invoke---BaseC

1、先静态的东东在前面,静态变量>静态构造方法

2、从子类到父类(非静态构造方法除外,确实从父类到子类,与Java一样);先子类的静态——>实例,在父类静态——>实例…………父类构造方法——>子类构造方法

执行顺序:

1.  初始化ChildClass的静态字段(按声明顺序)
 
2.  初始化ChildClass的静态构造函数
 
3.  初始化ChildClass的实例字段
 
4.  调用ChildClass的构造函数,并在此中断, 调用ParentClass的构造函数, 导致ParentClass开始初始化
 
5.  初始化ParentClass的静态字段
 
6.  初始化ParentClass的静态构造函数
 
7.  初始化ParentClass的实例字段
 
8.  调用ParentClass的实例构造函数
 
9.ParentClass初始化完毕, 调用ChildClass的构造函数,完成创建

内容版权声明:除非注明,否则皆为本站原创文章。

转载注明出处:http://www.heiqu.com/580f86f05b784cf98d9fd6c6a98ae292.html