PDF 课件和源代码下载地址:
https://gitee.com/geektime-geekbang/LetsJava
作者回复: 我好像在视频里提过一嘴, 但是是在后面讲解super的时候. 如果不从继承关系的角度看, 让this放在第一行确实是没有硬道理的. 后面讲到super的时候, 也就是下面两节: 71 | super:和父类对象沟通的桥梁 72 | super:调用父类的构造方法 会讲到, 子类的构造方法, 会强制在第一行调用父类的构造方法. 这一点和this要在第一行有关联. 而这一点, 也正是给了构造方法调用别的构造方法, 必须是第一行给了一个强理由. 首先说一下为什么"子类的构造方法, 会强制在第一行调用父类的构造方法", 这个我在视频里提了一嘴, (人工划重点)这是因为子类可以访问父类的方法和属性. 那么必须保证子类的对象在做任何事情之前, 子类里那个隐含的父类对象, 必须初始化完成. 否则, 初始化都没完成, 调用方法, 返回属性, 都可能得到的是不对的状态/值(人工划重点结束). 好, 知道了这一点之后, 很自然的可以推出, this调用必须也在第一行, 否则的话, this调用里会调用父类构造方法, 如果this不是第一句, 那么也就隐含着调用父类构造方法不是第一句, 也就是说, 子类可能使用的父类的属性或者方法是没有初始化完成的. 其实我也觉得这个挺别扭, 拿参数稍微算一下,再给构造方法不行吗? 但是这个确实很难控制, 或者说没必要做这么复杂. 是给自己挖坑. 所以干脆一刀切, super必须是第语句, this也必须是第一句.
作者回复: 修改源代码里的package为a,然后会提示错误,alt+enter自动修复,选择move to package a
作者回复: 构造方法就是用来初始化创建出来的对象的。1)是对的,对象先在内存里创建了出来,但是对象的状态可能不对(不符合业务逻辑),所以需要构造方法这段代码来给创建出来对这个新的对象初始化一下子。 2)也是对的。那么既然是初始化,在初始化之前,外部就不可以访问对象的任何属性/方法。因为这时候对象的状态是不对的。
作者回复: new M就是创建另一个新的实例了呀。 this()本质上是一个方法,用来初始化对象。new是一个表达式,用来创建新的实例。 一个是创建实例,一个是初始化刚刚创建出来的实例。你品,你细细品
作者回复: 对的,this(参数列表),就是在构造方法里调用重载的构造方法。
作者回复: 构造方法自己调自己应该会有编译错误
作者回复: ✅