1. super强调:

可以参照this⼀起来理解;
◦ this调⽤本类成员属性及⽅法「构造⽅法」
◦ super主要是调⽤⽗类/超类/基类当中的成员属性/⽅法/构造⽅法public修饰的
• super表⽰超级的意思,如super man, super stat啥的.
• java当中, super代表⽗类的存储空间标识「可理解为⽗类对象的引⽤」

2.super关键字的使用:

必须是 public 「⾮private修饰的成员变量/⽅法/构造⽅法」
1.调用父类的属性 格式:super.属性名
如果子类里面有跟父类同名属性
如果强调 去调用父类的使用可以使用super去调用;
2.调用父类的方法 格式:super.方法名()
//方法覆写:子类跟父类同名方法
一般是在方法覆写之后,因为要保留父类功能,
再父类功能基础上做扩展
3.调用父类的构造方法
①.在子类构造器中才可以用super调用父类构造器
调用方式同理this
.子类实例化过程:
无论子类new哪一个构造器 都会调用父类无参数构造器
因为无论子类new哪一个构造器
系统会自动在子类构造器补齐一个super();
在子类new对象时,会优先默认调用父类无参数构造器,
去实例化一个父类对象
(此时父类对象没有真正诞生 到多态里面去讲)
然后再调用子类对应构造器,去实例化子类对象
③. 为什么 why?:
因为构造器的作用就是用作当前类的属性初始化操作,
那么子类继承父类就继承了父类的属性和方法
如果不调用父类的构造器,那么相当于父类的属性,
没有通过构造器初始化,
那么就是没有值的一个属性被子类继承过来,这样是无意义的
④. super()根据参数可以匹配父类其他构造器
格式 : super(对应的参数形式);
⑤.为什么是默认调用父类无参的呢?(因为自动补齐super())
如果父类的初始化是用有参数构造器进行的,
那么子类如果调用父类有参数构造器呢?
利用super(参数)去匹配
⑥. 限制:
super()调用构造器必须写在子类构造器的首行
如果子类构造器的首行没有写super()调用父类构造器,
那么系统会自动补齐super();
this和super在调用构造器时不能同时出现
因为都要放在第一行 会起冲突
如果子类构造器首行没有this调用其他构造器,
那么系统补齐super();
⑦. this注意点:
在一个类中 构造器用this相互调用时,
一定要有一个构造器的首行没有用this调用其他构造器作为出口,
此时该构造器首行会自动补齐super()调用父类构造器
那么此时父类构造器就算是出口

补充:

  1. 父类没有无参构造器,子类一继承就会报错,<br /> 因为子类没有声明构造器时,系统自动分配无参数构造器,<br /> 并且赠送了一个在构造器首行的super()<br /> 调用父类无参数构造器<br /> 但是父类又没有无参数构造器,所以报错<br /> 解决:子类手动声明构造器(任何参数),然后在子类构造器首行用super去调用父类其他有参数构造器

this和super的区别

            this                super<br />            调用本类成员    调用父类成员<br />            当前类对象        不表示父类对象,没有父类对象的概念<br />            调用本类构造器            调用父类构造器<br />                都是写在构造器首行,不能同时出现<br />**this是现在本类找,本类没有再找父类,super是直接去父类找**<br />![image.png](https://cdn.nlark.com/yuque/0/2022/png/28889470/1654192579696-23c007c2-2f6b-43c0-a778-56ffe0ecf45a.png#clientId=u14310fe5-f96a-4&crop=0&crop=0&crop=1&crop=1&from=paste&height=293&id=u451529ca&margin=%5Bobject%20Object%5D&name=image.png&originHeight=366&originWidth=631&originalType=binary&ratio=1&rotation=0&showTitle=false&size=23101&status=done&style=none&taskId=u8ca3b846-c2a1-4a22-bd75-2cbc4db06bf&title=&width=504.8)<br />![image.png](https://cdn.nlark.com/yuque/0/2022/png/28889470/1654192595280-936b0241-4e6e-46ee-9d8b-934c9508df9f.png#clientId=u14310fe5-f96a-4&crop=0&crop=0&crop=1&crop=1&from=paste&height=404&id=uc129deef&margin=%5Bobject%20Object%5D&name=image.png&originHeight=505&originWidth=731&originalType=binary&ratio=1&rotation=0&showTitle=false&size=41498&status=done&style=none&taskId=u93d338c1-e009-4171-af8e-7a82430a64d&title=&width=584.8)

继承中的构造⽅法访问

⼦类中所有构造⽅法都会访问⽗类中的⽆参数的构造⽅法;「默认访问,即使不显⽰的写super()也会 调⽤⽗类的⽆参数的构造⽅法」
1. ⼦类会继承⽗类中的数据,可能还会使⽤⽗类的数据。
◦ ⼦类初始化之前,⼀定要先完成⽗类数据的初始化;「先有爸爸,再有⼉⼦;」
2. 如果⽗类中没有⽆参数的构造⽅法,怎么办?
◦ 通过使⽤super关键字显⽰的调⽤⽗类的带有参数的构造⽅法;
◦ ⽗类中提供⼀个⽆参数的构造⽅法; —> 推荐的⽅式;
image.png