为什么抽象类中的构造函数可以被继承并被调用?

namespace ConsoleApplication12
{
public abstract class A
{
static A() { Console.WriteLine("static A"); }
public A() { Console.WriteLine("normal A"); }
}

public class B : A
{
static B() { Console.WriteLine("static B"); }
public B() { Console.WriteLine("normal B"); }
}

public class Program
{
static void Main(string[] args)
{
B bb = new B();

Console.ReadKey();
}
}
}

输出:
static B
static A
normal A
normal B
抽象类A中的构造函数 public A() { Console.WriteLine("normal A"); } 被调用了,构造函数应该是用来实例化对象的吧,而抽象类是不能被实例化的,这是不是矛盾啊?请大神指点

----------------------------------------------------------

很容易理解,抽象类是需要被其他类继承的,这些子类是需要实例化的,实例化子类的时候是需要调用子类的构造函数的,而在默认情况下,在调用子类的构造函数前是先要调用基类的构造函数的,这一点和非抽象的类一样.因为你实例化的不是抽象类而是抽象类的子类,这个并不矛盾
 
你好,在你的回答中,我看到这么一句话,【而在默认情况下,在调用子类的构造函数前是先要调用基类的构造函数的】,那么为什么程序是先输出static B, 再输出 static A   normal A, 也就是为什么先调用了子类的静态构造函数,再调用父类的静态构造函数,根据我对你那句话理解,不应该是先调用父类的,再调用子类的吗??
这个问题问的好 那么我们看看静态构造函数的特点(来自MSDN)

静态构造函数既没有访问修饰符,也没有参数。

在创建第一个实例或引用任何静态成员之前,将自动调用静态构造函数来初始化类。
无法直接调用静态构造函数。
在程序中,用户无法控制何时执行静态构造函数。

也就是说 :静态构造函数是在创建第一个类实例前由系统调用的 所以你会看出来静态构造是为了初始化类的静态属性起作用的。那么类的静态属性有什么特点呢?那就是不能被继承,因此可以很容易推断出来,静态构造肯定会先初始化子类的信息 也会先调用。这点要跟构造函数区别开来
 
from:
https://zhidao.baidu.com/question/1303168048495748699.html
 
 
原文地址:https://www.cnblogs.com/aspirs/p/11296171.html