一直对this和super()关键字在使用方面和理解方面都不太清楚,根据以往经验和各种资料总结出以下内容:
java代码中要对象实列化时,至少有一条从本类出发到Object的通道,而这条通道的开辟者主要就是this和super,逢山开路,遇水搭桥,但是它俩往往是默默无闻的,在很多情况下可以被省略:
- 本类方法调用本类属性
- 本类方法调用另一个类方法(本类继承另一个类)
- 子类构造方法隐含调用super()
任何类在创建之时,都有一个默认的无参构造方法,这个无参构造方法就是super()的一条默认通道,构造方法的参数列表决定了调用通道的选择,如果子类指定调用父类的某个构造方法,super()就会不断的往上走,如果没有指定,则默认调用super(),如果父类没有提供默认的构造方法,子类在继承时就会编译错误
如果父类坚持不提供默认的无参构造方法,必须在本类的无参构造方法中使用super方式调用父类的有参构造方法,一个实列变量可以通过this赋值另一个实列变量,一个实列方法可以通过this调用另一个实列方法,甚至一个构造方法都可以通过this调用另一个构造方法,如果用this和super()指代构造方法,this和super()在一个构造方法中只能出现一个,也只能出现一次,如果两个都出现,或者多次出现在实列化对象时,会因子类调用到多个父类构造方法而造成混乱
由于this和super()都在实列化阶段调用,所以不能在静态方法和静态代码块中使用this和super()关键字,this还可以指代当前对象,如在同步(synchronized)代码块中,但是super()并没有此功能,但super()也有自己的功能,在子类重写父类方法时,可以使用super()调用父类同名的实列方法
this和super