在Java的基础学习中,慢慢接触到许多陌生的关键字,今天来讲一下我所认识的super关键字
它的使用场景为:有继承在⭐(必须在继承下才能使用super)
一.super调用(父类)构造方法
看下面这段代码
class Person{
public Person(){
System.out.println("1.Person类的构造方法");
}
}
class Student extends Person{
public Student(){
super(); //可写可不写,不写系统会自动在子类无参构造前加上super();表示先调用父类的无参构造;
System.out.println("2.Student类的构造方法");
}
}
public class Day6{
public static void main(String[] args){
Student stu = new Student();
}
}
打印结果为:
1.Person类的构造方法
2.Student类的构造方法
注意:
1.当父类存在无参构造时,当调用子类无参构造时,系统会自动在子类无参构造前加上super(),表示先调用父类的无参构造。 super语句可以省略,此时子类可以使用this调用构造方法。
2.当父类不存在无参构造时(指父类一个无参构造方法都没),必须在子类构造方法中使用super(参数);
明确指定调用父类的哪个有参构造。此时super语句不能省略;⭐且此时子类不存在this调用构造方法。
看下面这段代码:
class Person{
private String name;
private int age;
public Person(String name){
this.name = name;
}
public Person(String name, int age){
this(name); //this调用构造方法必须放在第一行,这里这样写是为了避免代码重复
this.age = age;
}
public Person(){
System.out.println("1.Person类的构造方法");
}
}
class Student extends Person{
private String school;
public Student(){
super("yy");
System.out.println("Student类的构造方法");
}
public Student(String school){
this();
//super("yy"); //对super的调用必须在构造方法的第一行
System.out.println("2.Student类的构造方法");
}
}
public class Day6{
public static void main(String[] args){
Student stu = new Student("beida");
}
}
运行结果如下:
Student类的构造方法
2.Student类的构造方法
这个代码中父类含有无参构造方法,所以在子类中可以使用this关键字来调用子类的构造方法,此时得省去super语句,免得跟this冲突,但省去后系统依旧会帮你加上,但不会报错,若不省去则会报错 ;
若将上面代码改成如下:
class Person{
private String name;
private int age;
public Person(String name){
this.name = name;
}
public Person(String name, int age){
this(name); //this调用构造方法必须放在第一行,这里这样写是为了避免代码重复
this.age = age;
}
}
class Student extends Person{
private String school;
public Student(){
super("yy");
System.out.println("Student类的构造方法");
}
public Student(String school){
this();
super("yy");
System.out.println("2.Student类的构造方法");
}
}
public class Day6{
public static void main(String[] args){
Student stu = new Student("beida");
}
}
可见父类中没有无参构造方法,但子类却使用了this调用构造方法,这是不允许的,所以会报错;
二.super调用普通方法
super调用方法或属性都是指调用父类中的方法或属性;
看下面简单的应用:
class Person{
public String info = "father";
public void print(){
System.out.println("i am father");
}
}
class Student extends Person{
public Student(){
super.print();
System.out.println(super.info); //不能super.父类的私有属性
}
}
public class Exer{
public static void main(String[] args){
Student stu = new Student();
}
}
将会输出:
i am father
father
我们可以看到,其实super的使用方法和this关键字有很大的相似之处,但最大的区别就在于super是访问父类的操作,而this是访问本类的操作!!