为什么抽象类中的构造函数可以被继承并被调用?
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
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】凌霞软件回馈社区,博客园 & 1Panel & Halo 联合会员上线
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】博客园社区专享云产品让利特惠,阿里云新客6.5折上折
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 浏览器原生「磁吸」效果!Anchor Positioning 锚点定位神器解析
· 没有源码,如何修改代码逻辑?
· 一个奇形怪状的面试题:Bean中的CHM要不要加volatile?
· [.NET]调用本地 Deepseek 模型
· 一个费力不讨好的项目,让我损失了近一半的绩效!
· 在鹅厂做java开发是什么体验
· 百万级群聊的设计实践
· WPF到Web的无缝过渡:英雄联盟客户端的OpenSilver迁移实战
· 永远不要相信用户的输入:从 SQL 注入攻防看输入验证的重要性
· 浏览器原生「磁吸」效果!Anchor Positioning 锚点定位神器解析