Java的super关键字问题(1)

本文深入解析Java中this与super关键字的区别与应用,包括它们在实例方法与构造方法中的使用规则,以及super如何用于调用父类构造方法,实现代码复用。同时,通过实例演示如何正确使用super关键字解决子类访问父类私有属性的问题。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

对于Java初学者来说,this关键字和super关键字有时会傻傻分不清,今天笔者将把super和this放在一起对比说明,希望对读者有所帮助

一、super和this:

this:

1、可以出现在实例方法和构造方法中
2、this不能使用在静态方法中
3、“this.”大部分情况可以省略(在区分局部和实例变量时不可省略)
4、this出现在构造方法第一行,通过当前构造方法调用“本类“”中其他构造方法,达到代码复用

super:

1、可以出现在实例方法和构造方法中
2、super不能使用在静态方法中
3、“super.”大部分情况可以省略
4、super()只能出现在构造方法第一行,通过当前构造方法调用“父类“”中其他构造方法,目的是创建子类型对象的时候先初始化父类型特征
5、super()表示通过子类的构造方法调用父类的构造方法
6、一个类若没有手动提供任何构造方法,系统默认提供一个无参数构造方法
7、一个类如果手动提供了一个构造方法,那么无参数构造系统将不再提供

二、super易错点:

当一个构造方法第一行既没有this()也没有super()的话,默认
会有一个super()表示通过当前子类的构造方法调用父类的无参数构造方法,所以必须保证父类的无参数构造方法是存在的。因为this()和super()不能共存,都是只能出现在构造方法第一行(无论如何父类的构造方法一定会执行)

三、super(实参)的用法:

1、首先定义一个Account类:
static class Account {

    //账号
    private String actno;

    //余额
    private double balance;
}
2、定义一个CreditAccount类去继承Account:
static class CreditAccount extends Account {

    //信誉度(子类特有的特征,父类没有)
    private double credit;
    
    public CreditAccount(String actno, double balance, double credit) {
            this.actno = actno;
            this.balance = balance;
            this.credit = credit;
    }
}

以上写法会报错,因为在父类Account中actno,balance和credit均被定义为私有属性,子类中不可调用,故报错。

3、解决方式:
static class CreditAccount extends Account {

    //信誉度(子类特有的特征,父类没有)
    private double credit;
    
    public CreditAccount(String actno, double balance, double credit) {
        super(actno, balance);
        this.credit = credit;
    }
}
上面代码显示,虽然子类中不可以调用父类中的private属性。但是子类可以通过super(实参)去继承父类中已有属性,再加上自己的特有属性。这样一来就巧妙避免了子类无法调取父类私有属性的问题。

四、说明:

在构造方法执行过程中一连串调用了父类的构造方法,父类的构造方法又继续向下调用他自己的父类的构造方法,但实际上对象只创建了一个。
下附JVM内存图帮助理解:

在这里插入图片描述

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值