📜  Java中的Super关键字

📅  最后修改于: 2020-03-29 04:58:26             🧑  作者: Mango

Java中的super关键字是一个引用变量,用于引用父类对象。关键字“ super”以继承的概念出现。它主要用于以下情况:
1.将super与变量一起使用:当派生类和基类具有相同的数据成员时,会发生这种情况。在这种情况下,JVM可能存在歧义。使用以下代码片段,我们可以更清楚地理解它:

/* 父类 vehicle */
class Vehicle
{
    int maxSpeed = 120;
}
/* 子类 Car extending vehicle */
class Car extends Vehicle
{
    int maxSpeed = 180;
    void display()
    {
        /* 打印父类的maxSpeed (vehicle) */
        System.out.println("最大速度maxSpeed: " + super.maxSpeed);
    }
}
/* 测试代码 */
class Test
{
    public static void main(String[] args)
    {
        Car small = new Car();
        small.display();
    }
}

输出:

最大速度maxSpeed: 120

在上面的示例中,基类和子类均具有成员maxSpeed。我们可以使用super关键字在sublcass中访问基类的maxSpeed。

2.将super与方法配合使用:当我们要调用父类方法时使用。因此,只要父类和子类具有相同的命名方法,然后使用super关键字来解决歧义。此代码段有助于理解super关键字的上述用法。

/*父类 class Person */
class Person
{
    void message()
    {
        System.out.println("父类");
    }
}
/* 子类 Student */
class Student extends Person
{
    void message()
    {
        System.out.println("子类");
    }
    // display()仅在子类中
    void display()
    {
        // 仅调用当前类的message()方法
        message();
        // 会调用父类的message()
        super.message();
    }
}
/* 测试代码 */
class Test
{
    public static void main(String args[])
    {
        Student s = new Student();
        // 调用 =display(),来自Student类
        s.display();
    }
}

输出:

子类
父类

在上面的示例中,我们看到,如果仅调用方法message(),则将调用当前的类message(),但通过使用super关键字,也可以调用超类的message()。

3将super与构造函数一起使用: super关键字也可以用于访问父类的构造函数。更重要的一点是,“ super”可以根据情况调用参数和非参数构造函数。以下是解释以上概念的代码段:

/* 父类 Person */
class Person
{
    Person()
    {
        System.out.println("Person构造函数");
    }
}
/* 子类Student extending Person */
class Student extends Person
{
    Student()
    {
        // 调用父类构造函数
        super();
        System.out.println("Student构造函数");
    }
}
/*测试代码*/
class Test
{
    public static void main(String[] args)
    {
        Student s = new Student();
    }
}

输出:

Person构造函数
Student构造函数

在上面的示例中,我们通过子类构造函数使用关键字“ super”调用了超类构造函数。
其他要点:

  1. 调用super()必须是派生类/子类(Student)类构造函数中的第一条语句。
  2. 如果子类构造函数未显式调用超类构造函数,则Java编译器会自动将调用插入到超类的无参数构造函数中。如果超类没有无参数构造函数,则将出现编译时错误。
  3. 如果子类构造函数显式或隐式调用其超类的构造函数,则您可能会认为调用了整个构造函数链,一直返回到Object的构造函数。实际上就是这种情况,这称为构造函数链 .