Java-关键字-super
super关键字的理解
- super表示超(父)类的意思,this表示对象本身。
- super关键字代父类空间的引用。
- super可用于访问父类被子类隐藏或覆盖的方法和属性,使用形式为 super.方法 。
- 在类的继承中,子类的构造方法中默认会有super()语句存在,不过默认是隐藏的,相当于执行父类的相应构造方法中的语句,如果显示使用必须位于类的第一行。
- 访问父类有参的构造方法,super不能省略,否则无法访问父类的有参构造方法,使用形式为super(xx,xx)。
super关键字的作用和规则
- 子父类存在着同名的成员(包括变量和方法)时,在子类中默认是访问子类的成员,可以通过super关键字指定访问父类的成员。
- 创建子类对象时,默认会先调用父类无参的构造方法,可以通过super关键字指定调用父类的构造方法。
- 如果在子类的构造方法中没有指定调用父类的构造方法,则Java编译器会在子类的构造方法内加上super()语句(默认)。
- super关键字调用父类构造函数时,该语句必须是子类构造函数的第一个语句。
- super与this关键字不能同时出现在同一个构造函数中调用其他的构造函数,因为两个语句都需要第一个语句。
- 注意: 是两个关键字不能同时出现在同一个构造函数中去调用其他的构造函数,里面还是可以写this.num = num。并不是说不能出现this。
- this关键字和super关键字使用前提不同
- super关键字必须要有继承才能使用。
- this关键字不需要存在继承关系可以使用。
- 调用构造函数的区别
- super关键字是调用父类的构造函数。
- this关键字是调用本类的构造函数。
代码示例
使用super变量
public class Animal {
public String kind = "动物";
}
public class Dog extends Animal{
public String kind = "哈士奇";
public void display(){
System.out.println("kind:"+super.kind);
}
public static void main(String[] args) {
Dog hsq = new Dog();
hsq.display();
}
}
运行结果:
上面的例子中,父类和子类都有一个kind类,我们可以使用super关键字访问基类的kind。
使用super方法
public class Animal {
public void eat(){
System.out.println("动物吃食物!");
}
}
public class Dog extends Animal{
public void eat(){
System.out.println("哈士奇吃骨头!");
}
public void display(){
eat();
//调用父类
super.eat();
}
public static void main(String[] args) {
Dog hsq = new Dog();
hsq.display();
}
}
运行结果:
在上面的例子中,我们可以看到,如果我们只调用方法eat(),那么当前类的eat()被调用,但是使用super关键字时,超类eat()也可以被调用。
使用超级构造函数
public class Animal {
public Animal(){
System.out.println("父类的构造方法");
}
}
public class Dog extends Animal{
public Dog(){
super();//可以不写,默认存在
System.out.println("子类的构造方法");
}
public static void main(String[] args) {
Dog hsq = new Dog();
}
}
运行结果:
在上面的例子中,我们通过子类构造函数的用关键字“super”调用超类构造函数。
注意
调用super()必须是类构造函数中的第一条语句。
如果子类构造函数调用其超类的构造函数,无论是显式还是隐式调用,您都可能认为调用了整个构造函数链,并返回到Object的构造函数。事实上,情况就是如此。它被称为构造函数链。
如果构造函数没有明确调用超类构造函数,那么Java编译器会自动向超类的无参构造函数插入一个调用。如果超类没有没有参数的构造函数,你会得到一个编译时错误。