目录
一.super 修饰属性
二.super 修饰方法
什么是方法重写
三.super 修饰构造方法
1.调用父类的无参构造
2.调用父类的有参构造
3.注意
一.super 修饰属性
如果想要在子类中调用被覆写的父类中的同名属性,使用 super 关键字,super 修饰属性,明确表示直接访问父类中的属性。
格式:super.属性名
eg:定义一个父类 Base1 ,定义一个子类 Derived 继承 Base1 ,使用 super 关键字在子类中调用覆写的属性 a 。
public class Base1 {
int a=10;
}
public class Derived extends Base1{
int a=20;
public void test(){
//调用子类Derived的属性a
System.out.println(a);
//调用父类Base1的属性a
System.out.println(super.a);
}
public static void main(String[] args) {
Derived derived=new Derived();
derived.test();
}
}
二.super 修饰方法
首先了解一个概念:
什么是方法重写
方法重写(Override):发生在有继承关系的类之间,子类定义了和父类除了权限不同以外其他全部相同(名称,参数列表,返回值都相同)的方法,称之为方法的重写。
注意:子类重写后的方法权限>=父类方法的权限。
如果我们想在在子类中调用被覆写后的父类方法,就可以使用super关键字来实现,表示直接从父类中寻找同名方法。
格式:super.方法名称()
eg: 子类 Derived 中的 testB 方法分别使用 this(指向该类) 和 super 关键字调用了子类中的 testA 方法和父类中的 testA 方法。
关于方法重写
- 调用子类:this.
- 调用父类:super.
关于this关键字的使用可以参考:Java中的this关键字的用法
public class Base1 {
int a=10;
void testA(){
System.out.println("调用父类中的testA方法");
}
}
public class Derived extends Base1{
int a=20;
public void test(){
//调用子类Derived的属性a
System.out.println(a);
//调用父类Base1的属性a
System.out.println(super.a);
}
public void testA(){
System.out.println("调用子类中的testA方法");
}
public void testB(){
//调用子类中的testA方法
this.testA();
//调用父类中的testA方法
super.testA();
}
public static void main(String[] args) {
Derived derived=new Derived();
// derived.test();
derived.testB();
}
}
三.super修饰构造方法
1.调用父类的无参构造
若调用的是父类的无参构造,可以不写。
2.调用父类的有参构造
若调用的是父类的有参构造,则必须显示使用 super(参数列表),明确表示先调用父类的构造方法。
格式:super(参数列表)
eg:
如果父类只有有参构造函数,那我们想要调用子类的构造函数,就必须使用 super 关键字,否则就会有以下提醒。
正确的调用:
Base1 中的有参构造函数:
public Base1(int a,int b){
this.a=a;
this.b=b;
System.out.println("调用父类的有参构造函数");
}
Derived中的无参构造函数:
public Derived(){
//先调用Base1中的有参构造函数
super(10,20);
System.out.println("调用子类的无参构造函数");
}
3.注意
- super 在子类中调用父类的构造方法必须在子类构造方法的首行。
- this 的构造方法调用也得放在首行,所以 this 和 super 表示构造方法调用时,不能同时出现。
- this 可以表示当前对象的引用,但是 super 没有这个特点,super 只能引用父类的属性或方法。
- super 和 this 都表示成员域的属性,这两个关键字都不能在静态域中直接使用。
如有建议或想法,欢迎一切讨论学习~