目录
一、super用法了解
二、用代码演示super访问成员变量
子类:
public class Zi extends Fu{//使用extends继承了父类
public String name="诸葛东";
public int age=22;
public void show (){
int age=11;
//访问局部变量的age
System.out.println(age);
//访问成员变量的age
System.out.println(this.age);
//访问父类成员变量的age
System.out.println(super.age);
}
}
父类:
public class Fu {
public String name="派大昕";
public int age=20;
public void show1(){
System.out.println("age");
}
}
测试类:
public class Demo {
public static void main(String[] args) {
//使用无参构造方法创建对象
Zi zi=new Zi();
zi.show();
}
}
三、继承中构造方法的访问特点
1.代码演示
子类:
public class Zi extends Fu{//使用extends继承了父类
public Zi(){
System.out.println("Zi类中无参构造方法被访问");
}
public Zi(int age){
System.out.println("子类中带参构造方法被访问");
}
}
父类:
public class Fu {
public Fu(){
System.out.println("Fu类的无参构造方法被访问");
}
public Fu(int age){
System.out.println("Fu类中带参构造方法被访问");
}
}
测试类:
public class Demo {
public static void main(String[] args) {
//使用无参构造方法创建对象
Zi zi=new Zi();
}
}
输出:
Fu类的无参构造方法被访问
Zi类中无参构造方法被访问
当我们使用带参构造方法创建对象时:
测试类:
public class Demo {
public static void main(String[] args) {
//使用带参构造方法创建对象
Zi zi=new Zi(20);
}
}
输出:
Fu类的无参构造方法被访问
子类中带参构造方法被访问
通过以上两次输出对比发现无论使用子类的无参构造方法还是使用子类的带参构造方法,首先都要访问父类的无参构造方法
2.解释
super()意思是访问父类的无参构造方法
3.如果父类中没有无参构造方法只有带参构造方法
四、继承中成员方法的访问特点
代码演示:
父类:
public class Fu {
public void show(){
System.out.println("Fu类中的show方法被调用");
}
}
子类:
public class Zi extends Fu{//使用extends继承了父类
public void show(){
super.show();
System.out.println("Zi类中的show方法被调用");
}
}
测试类 :
public class Demo {
public static void main(String[] args) {
Zi zi=new Zi();
zi.show();
}
}
输出:
Fu类中的show方法被调用
Zi类中的show方法被调用
五、super内存图
演示该程序执行流程:
第一步:
执行main方法,main方法进栈
第二步:
执行
这时候就要看子类里的代码
new的时候就在堆内存申请了存储空间,并且用无参构造方法创建对象进行了初始化,所以age=20也就出现了
因为调用了子类的构造方法,所以子类的构造方法就会入栈
进入子类的构造方法,第一步应该是默认的访问父类的无参构造方法
接着我们看父类的内容
有一个成员变量age
接着父类的内容要初始化
堆内存出现一个super存储空间来存储父类初始化的数据
初始化完毕就要访问父类的构造方法
父类无参构造方法被加入到栈内存
然后将父类无参构造方法的内容输出
父类无参构造方法执行完毕,从栈内存出去
然后继续执行,输出子类无参构造法内容
执行完毕,从栈内存出去
第三步:
执行:
接下来看子类的内容:
对于super方法来说是先找到调用者,再通过调用者找到super,再从super找到age,输出的是40