猿究院的小白研究猿 super关键字的用法总结(自用)

        从以往的学习过程中可以看出,当子类重写父类的方法后,子类对象将无法直接访问父类被重写的方法,为了解决这个问题,在java中专门提供了一个super关键字来访问父类的成员。

super关键字的功能:

        1.在子类的构造方法中显式的调用父类构造方法。

        2.访问父类的成员方法和变量。

需要注意的是:super( ) 必须是在子类构造方法的方法体的第一行。但是有些情况也可以省略。

语法为:

        1.super.

        2.super()

下面我们通过列子来解释说明super的用法

声明父类 Person 和子类 Student,在 Person 类中定义一个带有参数的构造方法,代码如下:

  1. public class Person {
  2. public Person(String name) {
  3. }
  4. }
  5. public class Student extends Person {
  6. }

会发现 Student 类出现编译错误,提示必须显式定义构造方法

在本例中 编译器会默认给 Student 类加了一个无参构造方法,而在这个方法中默认调用了 super(),但是 Person 类中并不存在该构造方法,所以会编译错误。

如果一个类中没有写任何的构造方法,编译器 会生成一个默认的无参构造方法。在继承关系中,由于在子类的构造方法中,第一条语句默认为调用父类的无参构造方法(即默认为 super(),一般这行代码省略了)。所以当在父类中定义了有参构造方法,但是没有定义无参构造方法时,编译器会强制要求我们定义一个相同参数类型的构造方法。

声明父类 Person,类中定义两个构造方法。示例代码如下:

  1. public class Person {
  2. public Person(String name, int age) {
  3. }
  4. public Person(String name, int age, String sex) {
  5. }
  6. }

子类 Student 继承了 Person 类,使用 super 语句来定义 Student 类的构造方法。示例代码如下:

  1. public class Student extends Person {
  2. public Student(String name, int age, String birth) {
  3. super(name, age); // 调用父类中含有2个参数的构造方法
  4. }
  5. public Student(String name, int age, String sex, String birth) {
  6. super(name, age, sex); // 调用父类中含有3个参数的构造方法
  7. }
  8. }

从上述 Student 类构造方法代码可以看出,super 可以用来直接调用父类中的构造方法,使编写代码也更加简洁方便。

编译器会自动在子类构造方法的第一句加上super();来调用父类的无参构造方法,必须写在子类构造方法的第一句,也可以省略不写。通过 super 来调用父类其它构造方法时,只需要把相应的参数传过去。

super访问父类成员

当子类的成员变量或方法与父类同名时,可以使用 super 关键字来访问。如果子类重写了父类的某一个方法,即子类和父类有相同的方法定义,但是有不同的方法体,此时,我们可以通过 super 来调用父类里面的这个方法。

使用 super 访问父类中的成员与 this 关键字的使用相似,只不过它引用的是子类的父类,语法格式如下:

super.number

其中,member 是父类中的属性或方法。使用 super 访问父类的属性和方法时不用位于第一行。

super调用成员属性

当父类和子类具有相同的数据成员时,JVM 可能会模糊不清。我们可以使用以下代码片段更清楚地理解它。

 
  1. class Person {
  2. int age = 22;
  3. }
  4. class Student extends Person {
  5. int age = 18;
  6. void display() {
  7. System.out.println("学生年龄:" + super.age);
  8. }
  9. }
  10. class Test {
  11. public static void main(String[] args) {
  12. Student stu = new Student();
  13. stu.display();
  14. }
  15. }

输出结果为:

学生年龄:22

在上面的例子中,父类和子类都有一个成员变量 age。我们可以使用 super 关键字访问 Person 类中的 age 变量。

super调用成员方法

当父类和子类都具有相同的方法名时,可以使用 super 关键字访问父类的方法。具体如下代码所示。

  1. class Person {
  2. void message() {
  3. System.out.println("This is person class");
  4. }
  5. }
  6. class Student extends Person {
  7. void message() {
  8. System.out.println(" student class");
  9. }
  10. void display() {
  11. message();
  12. super.message();
  13. }
  14. }
  15. class Test {
  16. public static void main(String args[]) {
  17. Student s = new Student();
  18. s.display();
  19. }
  20. }

输出结果为:

 student class
 person class

在上面的例子中,可以看到如果只调用方法 message( ),是当前的类 message( ) 被调用,使用 super 关键字时,是父类的 message( ) 被调用。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值