Java-继承-Super

时间:2020-02-23 14:36:38  来源:igfitidea点击:

在本教程中,我们将学习Java编程语言中的super关键字。

在先前的教程中,我们了解了继承以及如何访问继承的变量和方法。
随时检查一下。

Super关键字

在两种情况下,我们使用关键字" super"。

  • 从子类中调用父类的构造函数。

  • 访问隐藏在子类中的父类的成员。

调用父类的构造函数

为了从子类中调用父类的构造函数,我们使用" super"关键字,然后传递参数列表(如果有)。

语法:

class Parent {
  
  //constructor
  Parent() {
    //some code...
  }
}

class Child extends Parent {
  
  //constructor
  Child() {
    super();

    //some code...
  }
}

" super()"语句必须是子构造函数中调用父构造函数的第一条语句。

例1:访问父构造函数

在下面的示例中,我们有父类" Person"和子类" Employee"。
从子类内部,我们正在调用父类的构造函数。

//the parent class
class Person {
  //general member variables
  String firstname;
  String lastname;

  //constructor
  Person(String firstname, String lastname) {
    this.firstname = firstname;
    this.lastname = lastname;
  }

  //general method
  public void showName() {
    System.out.println("First name: " + this.firstname);
    System.out.println("Last name: " + this.lastname);
  }
}

//the child class inheriting the parent class
class Employee extends Person {
  //specific member variables
  String employeeid;
  int payscale;
  String joiningDate;

  //constructor
  Employee(String firstname, String lastname, String employeeid, int payscale, String joiningDate) {
    
    //calling the constructor of the parent class Person
    //to set the first name and last name
    super(firstname, lastname);

    //now setting the member variables of this class
    this.employeeid = employeeid;
    this.payscale = payscale;
    this.joiningDate = joiningDate;
  }

  //show employee details
  public void showDetail() {
    System.out.println("Employee details:");
    
    //calling the inherited method showName()
    //of the parent class Person
    //to show the first name and last name
    this.showName();

    //now calling the method of this class
    this.showEmployeeDetail();
  }

  public void showEmployeeDetail() {
    System.out.println("Employee ID: " + this.employeeid);
    System.out.println("Pay scale: " + this.payscale);
    System.out.println("Joining Date: " + this.joiningDate);
  }
}

//the main class
public class Example {
  
  //the main method
  public static void main(String[] args) {

    //employee data
    String firstname = "";
    String lastname = "";
    String employeeid = "E01";
    int payscale = 3;
    String joiningDate = "2010-01-01";

    //creating an object of the Employee class
    Employee empObj = new Employee(firstname, lastname, employeeid, payscale, joiningDate);

    //show detail
    empObj.showDetail();

  }
}
$javac Example.java 
$java Example
Employee details:
First name: 
Last name: 
Employee ID: E01
Pay scale: 3
Joining Date: 2010-01-01

访问隐藏在子类中的父类成员

super关键字的另一种用法是访问隐藏在子类中的父类的成员。

注意!如果子类成员变量与父类成员变量具有相同的名称,则父变量将隐藏在子类中。

例:

class Parent {
  int x;
}

class Child extends Parent {
  int x;
}

在上面的代码中,"孩子"类中的变量" x"隐藏了"父母"类中的变量" x"。

例2:访问父类成员变量

在下面的示例中,我们使用super关键字从子类访问父类的成员变量。

//the parent class
class Person {
  //general member variables
  String firstname;
  String lastname;

  //constructor
  Person(String firstname, String lastname) {
    this.firstname = firstname;
    this.lastname = lastname;
  }
}

//the child class inheriting the parent class
class Employee extends Person {

  //member variable "firstname" of this class
  //is hiding the member variable "firstname"
  //of the parent class Person
  //
  //note! firstname is also present
  //in the Person class and is inherited
  //in this Employee class
  String firstname = "Default firstname";

  //specific member variables
  String employeeid;
  int payscale;
  String joiningDate;

  //constructor
  Employee(String firstname, String lastname, String employeeid, int payscale, String joiningDate) {
    
    //calling the constructor of the parent class Person
    //to set the first name and last name
    super(firstname, lastname);

    //now setting the member variables of this class
    this.employeeid = employeeid;
    this.payscale = payscale;
    this.joiningDate = joiningDate;
  }

  //show employee details
  public void showDetail() {
    System.out.println("Employee details:");
    
    //this will give us the value stored in the
    //firstname member variable of this class
    System.out.println("First name (variable of Employee class): " + this.firstname);

    //to get the firstname that was saved in the
    //parent class member variable
    //we have to use the super keyword
    System.out.println("First name (variable of Person class): " + super.firstname);
    
    //showing the last name
    //this was inherited from the parent class Person
    //but since it is not hidden in the child class
    //Employee so, we are using the "this" keyword
    //to access it
    System.out.println("Last name (inherited variable of Employee class): " + this.lastname);

    //we can also use the "super" keyword and
    //access the lastname variable of the Person class
    System.out.println("Last name (variable of Person class): " + super.lastname);

    //now calling the method of this class
    this.showEmployeeDetail();
  }

  public void showEmployeeDetail() {
    System.out.println("Employee ID: " + this.employeeid);
    System.out.println("Pay scale: " + this.payscale);
    System.out.println("Joining Date: " + this.joiningDate);
  }
}

//the main class
public class Example {
  
  //the main method
  public static void main(String[] args) {

    //employee data
    String firstname = "";
    String lastname = "";
    String employeeid = "E01";
    int payscale = 3;
    String joiningDate = "2010-01-01";

    //creating an object of the Employee class
    Employee empObj = new Employee(firstname, lastname, employeeid, payscale, joiningDate);

    //show detail
    empObj.showDetail();

  }
}
$javac Example.java 
$java Example
Employee details:
First name (variable of Employee class): Default firstname
First name (variable of Person class): 
Last name (inherited variable of Employee class): 
Last name (variable of Person class): 
Employee ID: E01
Pay scale: 3
Joining Date: 2010-01-01