1、super是关键字,全部小写。
2、super和this对比:
this:
this能出现在实例方法和构造方法中。
this的语法: “this.” 、 “this ()”
this不能使用在静态方法中。
this.大部分情况下可以省略,在区分局部变量和实例变量的时候不可省略。
public void setName(String name){
this.name = name;
}
this () 只能出现在构造方法第一行,通过当前的构造方法去调用“本类”中其他的构造方法,目的是:代码复用。
super:
super能出现在实例方法和构造方法中。
super的语法: “super.” 、 “super ()”
super不能使用在静态方法中。
super.大部分情况下可以省略,在区分局部变量和实例变量的时候不可省略。
super什么时候不能省略?
super () 只能出现在构造方法第一行,通过当前的构造方法去调用“父类”中的构造方法,目的是:代码复用。 目的是:创建子类对象的时候,先初始化父类型特征。
3、super () 表示通过子类的构造方法调用父类的构造方法。模拟现实世界中这种场景:要想有儿子,先要有父亲。
4、重要结论:
当一个构造方法第一行:
既没有this()又没有super()的话,默认会有一个super();
表示通过当前子类构造方法调用父类的无参数构造方法。
所以必须保证父类的无参数构造方法是存在的。
5、this()和super()不共存。
6、无论怎样折腾,父类的构造方法是一定会执行的(100%)。
例题:分析下列程序执行结果
public class SuperTest02 {
public static void main(String[] args) {
new C();
}
}
class A {
public A () {
System.out.println("A类的无参数构造方法!");//1
}
}
class B extends A {
public B () {
System.out.println("B类的无参数构造方法!");//2
}
public B(String name) {
System.out.println("B类的有参数构造执行(String)");//3
}
}
class C extends B{
public C() {
this("zhangsan");
System.out.println("C的无参数构造执行!");//4
}
public C(String name) {
this(name,20);
System.out.println("C的有参数构造执行(String)");//5
}
public C(String name,int age) {
super(name);
System.out.println("C的有参数构造执行(String,int)");//6
}
}
结果为: 13654;
在恰当的时候使用 super (实际参数列表);
例:
public class Account {
private String actnum;
private double balance;//余额
public Account() {
}
public Account(String actnum, double balance) {
this.actnum = actnum;
this.balance = balance;
}
public String getActnum() {
return actnum;
}
public void setActnum(String actnum) {
this.actnum = actnum;
}
public double getBalance() {
return balance;
}
public void setBalance(double balance) {
this.balance = balance;
}
}
public class CreditAccount extends Account{
private double credit;
public CreditAccount() {
}
public double getCredit() {
return credit;
}
public void setCredit(double credit) {
this.credit = credit;
}
}
以上Account类已被封装好,在外部不能对actnum和balance进行赋值修改
为了能在CreditAccount中进行一步到位赋值操作,可以在CreditAccount类中使用super ();实现
public CreditAccount(String actnum, double balance, double credit) {
super(actnum, balance);
this.credit = credit;
}
public static void main(String[] args) {
CreditAccount ca2 = new CreditAccount("111",10000.0,0.99);
System.out.println(ca2.getActnum() + ca2.getBalance() + ca2.getCredit());
}
super(实参)的作用是:初始化当前对象的父类型特征。
并不是创建新对象,对象只创建了一个,只是在继承父类型特征。
super关键字代表的就是“当前对象” 的那部分父类型特征。
例如:我继承了我父亲的眼睛,鼻子等特征
super代表的就是“眼睛、鼻子”等特征。
而“眼睛、鼻子”虽然继承父亲的但这部分在我身上。
this . 什么时候不能省略:
public void setName(String name){
this.name = name;
}
super . 什么时候不能省略:
父中有,子中又有,如果想在子中访问“父的特征”,super . 不能省略。
super不是引用。super也不保存内存地址,super也不指向任何对象。
super只是代表“当前对象” 的那部分父类型特征。
System.out.println( this ); //编译通过
System.out.println( super ); //编译报错
在父和子中有同名的属性或是相同的方法,如果想在子类中访问父类中的数据,必须使用"super . "加以区分 。
super . 属性名:
super .方法名(实参)
super (实参)