@[TOC](学习目录
一.super使用场景
==在继承关系中,子类的无参构造器默认super()调用父类的==
==访问父类的属性和方法==
==调用父类构造器==
二.super用法
super代表父类的引用,它用于访问父类的属性,方法,构造器
建立在继承关系之上,依照访问修饰符遵循相应的访问规则
super大部分情况下是可以省略的,子类需要访问父类时,需要显式地写出来
1.super访问父类属性:
public void hey(){
this.name=super.name;
System.out.println(name); //输出的是父类的属性
}
通过一个小例子展示了通过super,访问并输出了父类的name属性
这里的name数据类型是引用类型,就相当于本类中name指向的是父类所对应的属性地址,达到访问父类属性的效果
2.super访问父类方法:
public void hey(){
//super可以调用父类的方法不能调用private方法
super.test100(); //test100为父类中可访问的方法
super.test200();
super.test300();
}
3.访问父类构造器:
public Person(String name, int age,double score) {
super(name, age); //访问父类构造器
this.score=score; //子类属性由子类初始化
}
三.super使用细节
①调用父类构造器可以让我们的分工更明确,因为父类属性是继承而来,所以由父类初始化,而子类中的属性可以由子类来初始化
②当出现特殊性情况,子类中有和父类中的成员方法/属性重名时,为了访问父类成员,必须通过super来指定,这就很大程度上体现了super的作用!例如:
public class Test001 {
public static void main(String[] args) {
Test test=new Test();
test.hey();
}
}
class Test0001{
String name="22";
}
class Test extends Test0001{
String name ="11";
public void hey(){
System.out.println(super.name);
}
}
运行结果:
22
四.super越级访问
super的访问不仅仅局限于邻近的父类,也可以是爷爷类,曾祖父类...:
访问的规则遵循就近原则
有一组继承关系CC—>BB—>AA
例如
class AA{
int a=888;
}
class BB extends AA{
int b=88;
}
class CC extends BB{
public void getNum() {
System.out.println(super.a);
}
}
public class Test {
public static void main(String[] args) {
CC c=new CC();
c.getNum();
}
}
运行结果
888
”访问了他的爷爷类“
就近原则示意图:
五. super与this
this | super |
---|---|
访问本类属性,没有就从父类查找 | 从父类开始查找属性 |
访问本类中的方法,没有就从父类查找 | 从父类开始查找方法 |
调用本类构造器,必须放在构造器首行 | 调用父类构造器,使用时放在首行 |
表示当前对象 | 用于子类访问父类对象 |