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


    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
     
     
  • 相关阅读:
    盒模型(框模型)
    边框
    尺寸及溢出处理
    HTML标签分类
    尺寸单位和颜色的取值
    选择器的优先级
    C++ 代码模板
    LC 425. Word Squares 【lock,hard】
    LC 660. Remove 9 【lock, hard】
    LC 759. Employee Free Time 【lock, hard】
  • 原文地址:https://www.cnblogs.com/aspirs/p/11296171.html
Copyright © 2020-2023  润新知