Java语言基础:对象的初始化

1.  如果基类存在默认构造函数,则在子类构造之前,会先调用基类的默认构造函数:

 

 

2.  如果基类只有带参数的构造函数,子类必须在自己的构造函数中通过super(...)显式调用该基类构造函数:

 

3.  以上只讲了最简单的构造函数调用顺序,其实一个对象的真正的初始化过程应该是:

  1. 将对象的存储空间初始化为二进制的0.
  2. 先递归到最上层的基类去,将最上层的基类作为当前类。
  3. 对于当前类:
    1. 按声明顺序调用成员变量的初始设置代码。
    2. 调用构造函数。
  4. 接着将下一层继承类作为当前类,继续步骤3

     

    先看下面的代码:

     

    初始化过程大概是这样的:

    1.  先从C递归到B,再从B递归到A。
    2. A没有成员变量,所以A的构造函数被调用。
    3. 接到回到B,B有一个D类的成员有初始化,因此D的构造函数被调用。
    4. 接着B的构造函数被调用。
    5. 最后回到C,C的构造函数被调用。

      所以输出应该是:

      A create

      D create

      B create

      C create

       

      4.  必须小心在构造函数中调用虚函数(在JAVA里普通函数都是虚的)的隐患,特别是在基类的构造函数,因为此时继承类的成员可能还没有初始完毕:

       A的构造函数调用了proc,此时B的构造函数还没有被调用,因此i还没有被赋为10,最终输出结果是0。

       

      5.  由于Java对象都是通过垃圾回收机制清理对象,因此Java的类没有析构函数,遇到需要清理类中资源的问题时,可以自己声明一个函数,如Dispose,在适当的时候调用之。

      • 0
        点赞
      • 7
        收藏
        觉得还不错? 一键收藏
      • 5
        评论
      评论 5
      添加红包

      请填写红包祝福语或标题

      红包个数最小为10个

      红包金额最低5元

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

      抵扣说明:

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

      余额充值