在Java中如何使用super关键字访问父类_OOP父类方法调用方法分享

super用于调用父类成员,可访问属性、方法和构造器。1. 子类重写方法后可用super.method()调用父类方法;2. 构造器中通过super()调用父类构造器,须位于首行;3. 子类同名字段隐藏父类字段时,用super.field访问父类属性;4. super不可在静态上下文中使用,且super()与this()不能共存于同一构造器首行。

在Java中,super关键字用于访问父类的成员,包括属性、方法和构造器。当你在子类中重写了父类的方法,但仍想调用父类中的原始实现时,super就显得非常有用。下面详细介绍如何使用super来调用父类的方法。

1. 调用父类的普通方法

当子类重写了一个方法后,如果仍需要执行父类中该方法的逻辑,可以使用 super.methodName() 来调用。

示例:

class Animal {
    void makeSound() {
        System.out.println("Animal makes a sound");
    }
}

class Dog extends Animal {
    @Override
    void makeSound() {
        super.makeSound(); // 调用父类方法
        System.out.println("Dog barks");
    }
}

输出结果:

Animal makes a sound
Dog barks

这里,super.makeSound() 明确调用了父类 Animal 的方法,再追加子类自己的行为。

2. 在构造器中调用父类构造器

子类构造器可以通过 super() 调用父类的构造器,必须放在构造器的第一行。

示例:

class Person {
    String name;

    Person(String name) {
        this.name = name;
        System.out.println("Person constructed: " + name);
    }
}

class Student extends Person {
    int studentId;

    Student(String name, int id) {
        super(name); // 调用父类构造器
        this.studentId = id;
        System.out.println("Student ID: " + id);
    }
}

创建 Student 对象时,会先初始化父类的 name 属性,再初始化子类的 studentId。

3. 访问被隐藏的父类属性

如果子类定义了与父类同名的字段,可以使用 super.fieldName 访问父类的字段。

示例:

class Parent {
    String info = "Parent info";
}

class Child extends Parent {
    String info = "Child info";

    void printInfo() {
        System.out.println(super.info); // 输出:Parent info
        System.out.println(this.info);  // 输出:Child info
    }
}

4. 注意事项

  • super只能在子类中使用,不能在静态上下文中使用(如 static 方法)。
  • 调用父类构造器的 super() 必须是子类构造器中的第一条语句。
  • 不能同时使用 this()super() 在同一个构造器中,因为两者都必须放在第一行。

基本上就这些。合理使用 super 可以让继承关系更清晰,代码复用更高效。理解其在方法、构造器和属性访问中的作用,是掌握Java面向对象编程的关键一步。不复杂但容易忽略细节。