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

Posted aspirs

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了为什么抽象类中的构造函数可以被继承并被调用?相关的知识,希望对你有一定的参考价值。

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
 
 

以上是关于为什么抽象类中的构造函数可以被继承并被调用?的主要内容,如果未能解决你的问题,请参考以下文章

继承中子类构造函数相关问题

Java 构造函数(抽象类中的构造函数) 和 加载

毕向东Java视频学习笔记Day09 继承+接口+抽象类

2017-4-16 多态 构造函数 方法重载 静态方法和静态成员

java中,当实例化子类时会递归调用父类中的构造方法。这个说法对么?为啥

super staticfinal关键字加深记忆哦!还有父子类构造函数调用问题