超级关键字使用示例

super 关键字在三个地方扮演重要角色

  1. 构造函数级别
  2. 方法级别
  3. 可变等级

构造函数级别

super 关键字用于调用父类构造函数。此构造函数可以是默认构造函数或参数化构造函数。

  • 默认构造函数:super();

  • 参数化构造函数:super(int no, double amount, String name);

     class Parentclass
     {
        Parentclass(){
           System.out.println("Constructor of Superclass");
        }
     }
     class Subclass extends Parentclass
     {
        Subclass(){
         /* Compile adds super() here at the first line
          * of this constructor implicitly
          */
         System.out.println("Constructor of Subclass");
        }
        Subclass(int n1){
         /* Compile adds super() here at the first line
          * of this constructor implicitly
          */
         System.out.println("Constructor with arg");
        }
        void display(){
         System.out.println("Hello");
        }
        public static void main(String args[]){
         // Creating object using default constructor
         Subclass obj= new Subclass();
         //Calling sub class method 
            obj.display();
            //Creating object 2 using arg constructor
            Subclass obj2= new Subclass(10);
            obj2.display();
       }
     }
    

注意super() 必须是构造函数中的第一个语句,否则我们将得到编译错误消息。

方法级别

super 关键字也可以在方法重写的情况下使用。super 关键字可用于调用或调用父类方法。

class Parentclass
{
   //Overridden method
   void display(){
    System.out.println("Parent class method");
   }
}
class Subclass extends Parentclass
{
   //Overriding method
   void display(){
    System.out.println("Child class method");
   }
   void printMsg(){
    //This would call Overriding method
    display();
    //This would call Overridden method
    super.display();
   }
   public static void main(String args[]){        
    Subclass obj= new Subclass();
    obj.printMsg(); 
   }
}

注意 :如果没有方法重写,那么我们不需要使用 super 关键字来调用父类方法。

可变等级

super 用于引用直接父类实例变量。在继承的情况下,可能有基类和派生类可能有类似的数据成员。为了区分基类/父类和派生/子类的数据成员,在派生类的上下文中基类数据成员必须以 super 关键字开头。

//Parent class or Superclass
class Parentclass
{
    int num=100;
}
//Child class or subclass
class Subclass extends Parentclass
{
    /* I am declaring the same variable 
     * num in child class too.
     */
    int num=110;
    void printNumber(){
     System.out.println(num); //It will print value 110
     System.out.println(super.num); //It will print value 100
    }
    public static void main(String args[]){
       Subclass obj= new Subclass();
       obj.printNumber();    
    }
}

注意 :如果我们不在基类数据成员名称之前写入 super 关键字,那么它将被称为当前类数据成员,而基类数据成员将隐藏在派生类的上下文中。