java函数和构造函数_JAVA的构造器和C++的构造函数有什么区别?

c8e0528e2c54542cd128dc5681a3ef5e.png

慕瓜9086354

Java和C++在构造函数中调用虚函数的区别首先可以认为,Java所有instance函数都是虚函数。C++类的构造函数中调用虚函数,并不能有多态效果。这样设计的理由是:在基类的构造函数中,派生类的成员尚未初始化,而派生类的虚函数定义可以使用派生类的成员,C++强制必须先初始化对象然后才能使用【这是C++设计new和构造函数的初衷】,所以不可以调用派生类的虚函数定义。C++虚函数的实现机制也可以解释这一现象:对象的虚函数表指针在调用构造函数前更新,指向该类的虚函数表。所以当调用基类的构造函数时,对象的虚函数表指针指向该基类的虚函数表,而不是指向派生类的虚函数表,所以虚函数调用没有多态效果。但是Java类的构造函数中调用虚函数,依然有多态效果。我是在看《The Java Programming Language, fourth edition》5.5 Inheriting Nested Types 这一节时看到了在Field initializer中调用【虚】函数,仍然有多态的效果,大吃一惊,经验证属实。《Thinking in Java, fourth edition》 Behavior of polymorphic methods inside constructors 这一节对此进行了评论:If you call a dynamically-bound method inside a constructor, the overridden definition for that method is used. However, the effect of this call can be rather unexpected because the overridden method will be called before the object is fully constructed. This can conceal some difficult-to-find bugs.总之,这是一把双刃剑,有利有弊,且弊大于利,要小心使用。《The Java Programming Language, fourth edition》5.5 Inheriting Nested Types 这一节举的例子可以使用两步初始化的方法解决,也可以使用延迟创建的方法解决,延迟创建是更好的办法。C++ 的不懂..帮你找了一下

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值