Java进阶篇之super关键字

引言

在前面的文章中,我们介绍了继承的相关概念(Java进阶篇之继承的概念),在Java继承机制中,super关键字是一个重要的工具,用于访问父类的属性和方法,特别是在子类覆盖了父类的成员时。通过使用super,子类可以调用父类的构造方法,访问父类的成员变量和方法,这在继承层次中至关重要。本文将深入探讨super关键字的使用方式及其相关注意事项。

一、super关键字的基本概念

super关键字用于引用父类对象,可以在以下几种场景中使用:

  • 调用父类的构造方法:使用super()可以调用父类的构造方法,这是构造子类对象时初始化父类的一种方式。
  • 访问父类的属性:在子类中,如果成员变量与父类同名,可以通过super来访问父类的成员变量。
  • 调用父类的方法:子类可以通过super调用父类被重写的方法。
二、调用父类的构造方法

在子类的构造方法中,super()必须是第一条语句,用于调用父类的构造方法。默认情况下,子类的构造方法会自动调用父类的无参构造方法,如果需要调用父类的有参构造方法,需要显式地使用super(参数)

class Parent {
    String name;

    Parent(String name) {
        this.name = name;
        System.out.println("Parent constructor called");
    }
}

class Child extends Parent {
    int age;

    Child(String name, int age) {
        super(name); // 调用父类的构造方法
        this.age = age;
        System.out.println("Child constructor called");
    }
}

public class Main {
    public static void main(String[] args) {
        Child child = new Child("John", 18);
    }
}

输出

Parent constructor called
Child constructor called

在这个例子中,Child类的构造方法通过super(name)调用了Parent类的构造方法,从而实现了对父类属性的初始化。

三、访问父类的属性

在子类中,如果存在与父类同名的成员变量,可以使用super.变量名来访问父类的变量。

class Parent {
    String name = "ParentName";
}

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

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

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

输出

Parent name: ParentName
Child name: ChildName

通过super.name,我们可以在Child类中访问Parent类的name属性,避免了与子类name属性的冲突。

四、调用父类的方法

在子类中重写父类的方法后,可以使用super.方法名()来调用父类的原始方法,这在需要保留父类部分功能的同时扩展新功能时非常有用。

class Parent {
    void display() {
        System.out.println("Parent Display");
    }
}

class Child extends Parent {
    @Override
    void display() {
        super.display(); // 调用父类的display方法
        System.out.println("Child Display");
    }
}

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

输出

Parent Display
Child Display

在这个例子中,Child类重写了Parent类的display方法,并通过super.display()调用了父类的方法,实现了方法的扩展。

五、super关键字的注意事项

重要注意事项

  • super必须在子类构造方法的第一行:在子类构造方法中调用super()时,它必须是第一条语句,否则会导致编译错误。
  • 不能使用super调用父类的私有方法或属性super只能访问父类的公共(public)和受保护(protected)成员,无法访问父类的私有(private)成员。
  • 避免与this混淆super用于访问父类的成员,而this用于访问当前类的成员。两者的使用场景不同,需注意区分。
六、知识结构图解

以下是关于super关键字的知识结构图解:

super关键字的基本概念
调用父类的构造方法
super
访问父类的属性
避免命名冲突
调用父类的方法
方法扩展
super关键字的注意事项
super必须在子类构造方法的第一行
不能访问父类的私有成员
与this的区别
七、总结

super关键字在Java的继承机制中扮演着重要的角色,它允许子类访问和调用父类的属性和方法,特别是在子类重写了父类的成员时。通过合理使用super,开发者可以在子类中保留父类的功能,并在此基础上进行扩展。掌握super关键字的用法对于理解Java的继承机制至关重要。在下一篇文章中,我们将继续深入探讨Java继承中的重写和Java中重载的区别以及其他重要概念,帮助你更好地掌握Java的高级特性,敬请期待!

  • 16
    点赞
  • 12
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值