PDF 课件和源代码下载地址:
https://github.com/geektime-geekbang/LetsJava
作者回复: 我好像在视频里提过一嘴, 但是是在后面讲解super的时候. 如果不从继承关系的角度看, 让this放在第一行确实是没有硬道理的.
后面讲到super的时候, 也就是下面两节:
71 | super:和父类对象沟通的桥梁
72 | super:调用父类的构造方法
会讲到, 子类的构造方法, 会强制在第一行调用父类的构造方法. 这一点和this要在第一行有关联. 而这一点, 也正是给了构造方法调用别的构造方法, 必须是第一行给了一个强理由.
首先说一下为什么"子类的构造方法, 会强制在第一行调用父类的构造方法", 这个我在视频里提了一嘴, (人工划重点)这是因为子类可以访问父类的方法和属性. 那么必须保证子类的对象在做任何事情之前, 子类里那个隐含的父类对象, 必须初始化完成. 否则, 初始化都没完成, 调用方法, 返回属性, 都可能得到的是不对的状态/值(人工划重点结束).
好, 知道了这一点之后, 很自然的可以推出, this调用必须也在第一行, 否则的话, this调用里会调用父类构造方法, 如果this不是第一句, 那么也就隐含着调用父类构造方法不是第一句, 也就是说, 子类可能使用的父类的属性或者方法是没有初始化完成的.
其实我也觉得这个挺别扭, 拿参数稍微算一下,再给构造方法不行吗? 但是这个确实很难控制, 或者说没必要做这么复杂. 是给自己挖坑. 所以干脆一刀切, super必须是第语句, this也必须是第一句.