Java中super的多种用法及与this的区别

在Java编程语言中,super关键字用于引用当前对象的父类实例,主要用于访问父类的成员变量和方法。将深入探讨super的几种用法,并对比this关键字的区别。

  1. 调用父类构造器:当子类创建一个新实例时,如果需要调用父类构造器,必须在子类构造函数的第一行使用super(),如下面的BaseChecket类所示。这是因为子类构造器首先执行父类的构造器,确保父类的状态正确初始化。如果不在首行放置super(),编译器会报错,因为父类的构造器必须是子类构造器的第一个动作。
class Base {
    Base() {
        System.out.println("Base");
    }
}

public class Checket extends Base {
    Checket() {
        super(); // 必须放在首位调用父类构造器
        System.out.println("Checket");
    }

    public static void main(String[] args) {
        Checket c = new Checket();
    }
}
  1. 访问被隐藏的父类成员:当子类和父类有同名的成员变量或方法时,子类的方法会覆盖父类的同名方法,成员变量则会隐藏父类的成员。这时,使用super关键字可以显式地访问父类的成员。例如:
class Country {
    String name;
    void value() {
        name = "China";
    }
}

class City extends Country {
    String name;
    void value() {
        name = "Hefei";
        super.value(); // 访问父类的value方法
        System.out.println(name);
        System.out.println(super.name); // 访问父类的name成员变量
    }

    public static void main(String[] args) {
        City c = new City();
        c.value();
    }
}
  1. 调用父类的覆盖方法:如果子类重写了父类的方法,但仍然需要调用父类的实现,可以使用super关键字。需要注意的是,super不能用于调用非覆盖的父类方法,只能用于访问已被覆盖的父类方法。例如:
class Country {
    String name = "xianfan";
    String value(String name) {
        name = "China";
        return name;
    }
}

class City extends Country {
    String name;
    String value(String name) {
        name = "Hefei";
        super.value("失败"); // 调用父类的value方法
        System.out.println(name);
        System.out.println(super.name);
        return name;
    }

    public static void main(String[] args) {
        City c = new City();
        c.value("成功");
    }
}
  1. 传递参数给父类构造器super还可以用于在子类构造器中传递参数给父类的有参构造器,确保父类实例的初始化:
class Person {
    public static void prt(String s) {
        System.out.println(s);
    }

    Person() {
        prt("A Person.");
    }

    Person(String name) {
        prt("A person name is: " + name);
    }
}

public class Student extends Person {
    String name;
    Student(String name) {
        super(name); // 传递参数给父类的构造器
        this.name = name;
    }

    public static void main(String[] args) {
        Student s = new Student("John Doe");
    }
}

总结起来,super关键字在Java中主要扮演以下角色:

- 调用父类的构造器。

- 访问父类被隐藏的成员变量和方法。

- 调用父类已被覆盖的方法。

- 传递参数给父类的有参构造器。

this关键字则用于引用当前对象自身,常用于构造器之间调用、访问当前对象的成员变量等。superthis的区别在于前者指向父类,后者指向当前类实例。

doc 文件大小:57.5KB