为什么需要学习super?
能够帮助子类 初始化 父类继承下来的成员,从而 简 化 代 码 \color{red}{简化代码} 简化代码
super的定义:
与this概念区分
- this代表当前对象,创建任何一个对象,都会创建一个this引用和该对象指向同一个堆区的空间, t h i s 就 是 一 个 地 址 \color{red}{this就是一个地址} this就是一个地址
- super代表父类存储空间的标识,super可以通过这个标识访问父类的成员,super可以理解为父类对象,
- t h i s 可 以 作 为 参 数 传 入 到 方 法 的 形 参 中 \color{red}{this可以作为参数传入到方法的形参中} this可以作为参数传入到方法的形参中 ,super不可以
super和this访问成员的特点:
成员变量
-
this.成员变量
-
super.成员变量
成员方法
-
this.成员方法
-
super.成员方法
构造方法
-
this(参数列表) ----------------只能在构造方法中写
-
super(参数列表)
特点分析
-
任何一个构造方法第一句都会先访问父类无参构造方法
-
this super 访问构造方法必须出现第一句
-
this 和 super 访问构造方法不能够共存
-
super可以访问父类的成员(*************但不能访问private*****************)
-
7.static上下文不能够出现this super(static加载好了,可能对象还没被创建)
1.为什么访问子类构造方法之前会访问父类构造方法?
访问父类无参构造方法导致所有的父类的静态成员和静态代码块被加载,最终根类Object类的注册方法也会被加载 帮 助 子 类 初 始 化 父 类 继 承 过 来 的 成 员 、 方 法 \color{red}{ 帮助子类初始化父类继承过来的成员、方法} 帮助子类初始化父类继承过来的成员、方法
2.访问子类构造方法会访问父类构造方法,那么会不会创建子类对象的同时创建父类对象?
不会 使用super/this方法构造方法就相当于调用普通方法,需要创建对象访问构造方法必须结合 new
super相关面试题
输出10 20 30 40
public class SuperDemo02 {
public static void main(String[] args) {
Son son = new Son();
son.show();
}
}
class Father {
int num = 30;
public void show() {
int num = 40;
System.out.println(num);
}
}
class Son extends Father {
int num = 20;
public void show() {
int num = 10;
// 希望打印结果是 10
System.out.println(num);
// 希望打印结果是 20
System.out.println(this.num);
// 希望打印结果是 30
System.out.println(super.num);
// 希望打印结果是 40
super.show();
}
}
另一个代码题
请问输出的值是多少?
public class SuperDemo03 {
public static void main(String[] args) {
Zi zi = new Zi();
System.out.println(zi.num);
}
}
class Fu {
int num = 10;
public Fu(int num) {
this.num = num;
}
}
class Zi extends Fu {
int num = 20;
}
其实这段代码会报错,因为在ZI类实例化时会自动调用父类的无参构造方法,但是父类的无参构造没有了(Fu已经写了构造方法,会覆盖系统给Fu的无参构造)
此时没有无参构造,则报错!
解决方法:在Fu中添加无参构造
正常情况下是20