super概述
-
super能出现在实例方法和构造方法中
-
super语法:
super.
super( )
-
super不能使用在静态方法中
-
super.大部分情况可以省略
- 什么时候不能省略呢?
当访问的属性是父类型属性的时候不能省。例如,父类子类都有一个name属性,父.name=张三,子.name=张四 。那么super.name=张三,name=张四,带上super就是父类的属性,不带super就是子类 的属性
- super( )只能出现在构造方法的第一行,通过当前方法调用父类其他构造方法,目的是创建子类对象的时候先初始化父类型特征。
class A{
//A的无参构造方法
public A(){
System.out.println("A执行!");
}
}
class B extends A{
//子类方法第一行会默认super();调用父类的无参构造方法
public B(){
System.out.println("B执行!");
}
}
// main方法中new一个B对象,程序执行结果为:A执行!
// B执行!
重要结论:
当一个构造方法第一行既没有this( ) 又没有 super( )时,默认会有一个super( ),表示通过当前的子类构造方法调用父类的无参构造方法,如果父类没有无参构造方法,则会报错,所以建议把无参构造方法手动写出来。
super();内存图
super(实参);
到底是干啥的???--------初始化父类型特征
一个子类创建对象,这个子类对象必然会包含父类的特征,父亲的特征如何传给儿子呢?
答案是在子类的构造方法中调用父类的构造方法(构造方法的作用-->初始化类的特征属性)完成对父类特征的初始化,从而将父类的特征初始化给了子类对象。
这就是为什么在构造方法的第一行会默认有super( )的原因,因为这个类在调用构造方法创建对象的时候,需要将其父类的特征继承过来。
super
关键字,不是引用,不保存任何内存地址,也不指向任何对象,super代表的就是当前对象身上那部分父类型特征
总结
需要在子类构造方法中调用父类构造方法就用super();
需要访问父类的属性,就用super.父类属性。