权重域名

已备案域名,老域名交易,高权重域名购买,百度权重域名出售,权重域名买卖,万网已备案老域名注册查询抢注转让,买老域名,二手老域名,鹰潭网站建设

构造函数的调用顺序

构造函数的调用顺序

构造函数总是与众不同,牵涉到多态性的时候也不例外。尽管构造函数不是多态的(实际上它们都是static方法,只是声明的时候没有直说),但是能理解它在复杂的类系和多态的环境下是如何工作的,仍然十分重要,在创建派生类对象的过程中,基类的构造函数总是先得到调用,这样一级一级的追溯上去,每个基类的构造函数都会被调用。这种做法是很合乎情理的,因为构造函数有一个特殊的任务:它要知道对象是不是被正确地创建了。

派生类只能访问它自己的成员,它看不到基类的成员(因为它们通常是private的)。只有基类的构造函数才知道怎样初始化它的成员,同时也只有它才有权限进行初始化。因此“把所有的构造函数都调用一遍”就变得非常重要了,否则对象就没法创建了。这就是为什么编译器会强制每个派生类都要调用其基类的构造函数的原因了。如果你不在派生类的构造函数里明确地调用基类的构造函数,那编译器就会悄悄的调用那个默认的构造函数。如果没有默认构造函数,编译器就会报错。要是类没有构造函数,编译器会自动为你准备一个默认构造函数。

多态方法在构造函数中的行为

多态方法在构造函数中的行为

构造函数的调用顺序也带来了一个有趣的难题。如果构造函数调用了一个动态绑定的方法,而这个方法又属于正在创建中的对象,那它会产生什么样的效果呢?如果是普通方法,你猜也可以猜到它会怎么做:由于不制动啊这个对象应该算是基类还是派生类的,因此动态绑定会在运行时进行解析。处于一致性的考虑,你可能认为构造函数也应该这么做。

事实并非完全如此。如果你在构造函数里面调用了动态绑定的方法,那么它会使用那个覆写后的版本。但是这个效果会有些出人意料,因此会称为一些不易排查的bug的藏身之处。

从理论上讲,构造函数的任务就是创建对象(这可不是什么轻而易举的事)。从构造函数的角度来看,对象可能只创建了一半——你只知道基类对象已经初始化了,但是你还不知道它会派生出什么类。但是动态绑定的方法调用,会从外面把手伸进类系。它调用的是派生类的方法。如果你在构造函数里面这么做的话,你就可能调用了一个会访问尚未初始化的成员的方法了——注定会出问题。

«1»