super 关键字的作用?

参考回答

super 是 Java 中的一个关键字,用于引用父类的成员(包括属性、方法、构造方法),可以在子类中调用父类的构造方法或访问父类的成员。

主要作用有以下几点:

  1. 调用父类的构造方法
  2. 调用父类的成员变量
  3. 调用父类的方法

详细讲解与拓展

1. super 调用父类的构造方法

在子类的构造方法中,super() 用于显式调用父类的构造方法。

  • 如果子类构造方法中没有显式调用 super()this(),Java 会默认调用父类的无参构造方法。
  • 如果父类没有无参构造方法,则子类必须显式调用父类的带参构造方法。

示例 1:父类有无参构造方法

class Parent {
    public Parent() {
        System.out.println("Parent's no-arg constructor");
    }
}

class Child extends Parent {
    public Child() {
        super(); // 默认调用父类无参构造方法
        System.out.println("Child's constructor");
    }
}

public class Test {
    public static void main(String[] args) {
        Child child = new Child();
    }
}

输出

Parent's no-arg constructor
Child's constructor

示例 2:父类只有带参构造方法

class Parent {
    public Parent(String name) {
        System.out.println("Parent's constructor: " + name);
    }
}

class Child extends Parent {
    public Child() {
        super("Alice"); // 必须显式调用父类构造方法
        System.out.println("Child's constructor");
    }
}

public class Test {
    public static void main(String[] args) {
        Child child = new Child();
    }
}

输出

Parent's constructor: Alice
Child's constructor

2. super 调用父类的成员变量

  • 如果子类和父类有同名的成员变量,可以使用 super 来访问父类的成员变量。
  • 如果没有使用 super,则默认访问的是子类的成员变量。

示例

class Parent {
    public String name = "Parent";
}

class Child extends Parent {
    public String name = "Child";

    public void displayNames() {
        System.out.println("Child name: " + name); // 访问子类的 name
        System.out.println("Parent name: " + super.name); // 访问父类的 name
    }
}

public class Test {
    public static void main(String[] args) {
        Child child = new Child();
        child.displayNames();
    }
}

输出

Child name: Child
Parent name: Parent

3. super 调用父类的方法

  • 如果子类重写了父类的方法,可以通过 super 调用被重写的父类方法。
  • 如果没有使用 super,则默认调用的是子类的重写方法。

示例

class Parent {
    public void display() {
        System.out.println("Parent's display method");
    }
}

class Child extends Parent {
    @Override
    public void display() {
        System.out.println("Child's display method");
    }

    public void show() {
        display(); // 调用子类的 display 方法
        super.display(); // 调用父类的 display 方法
    }
}

public class Test {
    public static void main(String[] args) {
        Child child = new Child();
        child.show();
    }
}

输出

Child's display method
Parent's display method

4. super 的限制

  1. 必须是子类方法或构造方法中使用
  • 不能在静态方法中使用 super,因为静态方法属于类,而 super 是针对实例的。

    错误示例:

    class Parent {
       public void display() {}
    }
    
    class Child extends Parent {
       public static void staticMethod() {
           super.display(); // 编译错误
       }
    }
    
  1. 必须是构造方法的第一行调用
  • 在子类构造方法中调用父类构造方法时,super() 必须是构造方法的第一行。

    错误示例:

    class Parent {
       public Parent(String name) {}
    }
    
    class Child extends Parent {
       public Child() {
           System.out.println("Before super"); // 编译错误
           super("Alice");
       }
    }
    
  1. 不能用于调用祖父类的成员
  • super 只能直接访问父类的成员,不能访问祖父类的成员。

5. 拓展知识

  1. thissuper 的对比
特性 this super
作用域 当前类 父类
调用构造方法 调用当前类的其他构造方法 调用父类的构造方法
调用成员变量 当前类的成员变量 父类的成员变量
调用方法 当前类的方法 父类的方法
  1. super 的使用场景
    • 访问被隐藏的父类成员变量:当子类与父类有同名变量时。
    • 调用被重写的父类方法:当子类重写了父类方法时。
    • 初始化父类部分:在子类构造方法中调用父类构造方法。

6. 总结

  • super 是 Java 中用于访问父类成员(属性、方法、构造方法)的关键字。

  • 主要作用:

    1. 显式调用父类的构造方法。
    2. 访问父类的成员变量(尤其是被子类隐藏的变量)。
    3. 调用父类的方法(尤其是被子类重写的方法)。
  • 注意事项:
    • 在构造方法中,super() 必须是第一行。
    • 不能在静态方法中使用 super
  • super 是继承体系中处理父类与子类关系的重要工具。

发表评论

后才能评论