java ctor_.ctor,.cctor 以及 对象的构造过程

.ctor:

简述:构造函数,在类被实例化时,它会被自动调用。

当C#的类被编译后,在IL代码中会出现一个名为.ctor的方法,它就是我们的构造函数,对应C#中的构造函数。且看下面的代码:

731655954c7be9d8835ece551b5385f8.pngpublicclassClass1

24a924a57ba6b3f2b51fc9edb7ea4186.png

9310e85a14af99de4811ff4c77f1f911.png222530190136c9c4cfd237cc0d5cff99.png{

1408c5260b2f05e450dee929db9be5f7.pngprivatestringname;

1408c5260b2f05e450dee929db9be5f7.pngprivateintage;

f466905a3bcb5dcef110eab799825254.png}731655954c7be9d8835ece551b5385f8.png

类Class1中没有显示的构造函数,只有两字段,现在用ILDasm.exe打开编译后生成的exe文件,会看到:

5cee23c56caa394c80706d40a0822617.png

可以看到这里有个.ctor,我们没有定义构造函数,但这里却出现了.ctor,这就说明了:

当没有显示定义构造函数时,会自动生成一个构造函数,它没有参数,没有返回值。

那我们来看看这个.ctor都干了什么吧,双击.ctor打开,在弹出的窗口中可以找到下面的几行代码:

IL_0000: ldarg.0

IL_0001: call       instance void [mscorlib]System.Object::.ctor()

IL_0006: ret

上面就是这个.ctor的方法体,看上面的红色行,从字面上可以看出,它是调用(call)了一个类型为System.Object的实例的.ctor()方法,从这就可以证明:

当一个类没有显示声明继承于其它某个类时,它将默认继承自System.Object,并且,在类的构造函数中将会调用其基类的构造方法(.ctor)。

现在对上面的程序小改一下,在声明name时对其初始化:

731655954c7be9d8835ece551b5385f8.pngpublicclassClass1

24a924a57ba6b3f2b51fc9edb7ea4186.png

9310e85a14af99de4811ff4c77f1f911.png222530190136c9c4cfd237cc0d5cff99.png{

1408c5260b2f05e450dee929db9be5f7.pngprivatestringname="Lin";

1408c5260b2f05e450dee929db9be5f7.pngprivateintage;

f466905a3bcb5dcef110eab799825254.png}731655954c7be9d8835ece551b5385f8.png

再用ILDasm打开生成的exe文件,打开.ctor,里面有这么几行:

IL_0000: ldarg.0

IL_0001: ldstr      "Lin"

IL_0006: stfld      string ConsoleApplication1.Class1::name

IL_000b: ldarg.0

IL_000c: call       instance void [mscorlib]System.Object::.ctor()

IL_0011: nop

这个跟刚才的相比,多出了红色的那两行,这两行出现在“调用System.Object的构造方法”之前,这说明:

如果在字段声明的同时对其初始化,那么在编译后,赋值过程将被放到构造方法.ctor中,并且在调用其基类的构造方法之前进行。现在给上面的C#程序显式加上一个构造方法,它接受两个参数:

731655954c7be9d8835ece551b5385f8.pngpublicclassClass1

24a924a57ba6b3f2b51fc9edb7ea4186.png

9310e85a14af99de4811ff4c77f1f911.png

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值