Java的super关键字问题(1)
对于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内存图帮助理解:
本文地址:https://blog.csdn.net/DavidGarrett/article/details/107693837