super如果想要简单的记忆的话,你可以把super想象成父类的this,也就是相当于一个父类的一个对象。
接下来是super的主要的三个方法:
1.调用父类的构造方法(super())
2.调用父类的成员方法 (super.方法名)
3.调用父类的成员变量(字段) (super.变量名)
注意:
1.super()不能出现在静态方法中,super()可以放在构造方法和成员方法中,但如果放在构造方法中,只能放在构造方法的第一行(因此不能同时写this()和super())。如果子类的构造方法中没有写super(),那么会子类的构造方法中默认有super(),也就是会自动调用父类的无参构造方法。
2.2和3调用的父类的方法或者变量其实是子类所重写或者重定义的之前的方法或者变量。
这样说可能不是很清楚,接下来我会用实例来说明:
我先把整个代码写在下面,再依次分析。
完整代码:
class people{
public String name;
public people(String name){
this.name=name;
}
public people(){
name="无";
}
@Override
public String toString() {
return "name='" + name ;
}
}
class student extends people{
public int grade;
public int name;
public String getName1(){
return super.name;
}
public int getName2(){
return this.name;
}
public student(String name,int grade){
super(name);
this.grade=grade;
}
public student(){
super();
grade=-1;
}
@Override
public String toString() {
return super.toString() +
"grade=" + grade ;
}
}
public class Main{
public static void main(String[] args) {
student s =new student();
System.out.println(s.toString());
student s1 =new student("王",99);
System.out.println(s1.toString());
}
}
运行结果:
name='无grade=-1
name='王grade=99
1.调用父类的构造方法
public student(String name,int grade){
super(name);
this.grade=grade;
}
public student(){
super();
grade=-1;
}
这里就是使用了super()来调用父类的构造方法,第一个super(name)调用了父类的people(String name)的构造方法,第二个super()调用了父类的public people()的构造方法。
这就说明了你想要调用父类的哪个构造方法,就相应的用super(参数)调用那个构造方法。
注意
因为我们上面说过如果子类的构造方法中没有写super(),那么会子类的构造方法中默认有super(),也就是会自动调用父类的无参构造方法。那么其实下面的代码也是没有问题的:(其实就是省略了super())
public student(){
grade=-1;
}
2.调用父类的成员方法 (super.方法名)
@Override
public String toString() {
return super.toString() +
"grade=" + grade ;
}
这个方法是在子类重写父类的成员方法,而这里super.toString()就是调用了被子类重新定义之前的父类的toString()方法。
3.调用父类的成员变量(字段) (super.变量名)
public String getName1(){
return super.name;
}
这里返回被子类重新定义之前的父类的成员变量,所以是返回的是String类型。
public int getName2(){
return this.name;
}
这里返回的是子类的重新定义的成员变量,所以是返回的是int类型。