——java中使用super关键字来调用父类的指定操作
- super.可以调用父类的方法、属性、构造器
1. super使用注意:
- 在子类中用 super. 调用方法、属性、构造器时默认是直接去父类中去找的,在子类中用 this. 调用方法、属性时是去本类中去找的
- 在定义子类,写子类的方法和构造器时,通过super.属性和super.方法来调用父类的属性方法 或 使用this.属性和this.方法来调用父类的方法属性,但是this和super在有些情况下可以省略有些情况下不能省略。
- 若当子类重写了父类的show()方法,但是在子类的构造器或者方法的函数体中需要用到父类的show(),则必须使用super.show()才表示是父类的show(),如果要在子类中使用该子类重写的show(),可以直接调用show()或this.show(),this此时可省略
- 方法是可以重写的,属性没有重写操作
- 若当子类和父类都有属性age,但是在子类的构造器或者方法的函数体中需要用到父类的age,则必须使用super.age才表示是父类的,如果要在子类中使用该子类的age,可以直接调用age或this.age,this此时可省略
- 如果定义了父类person和子类student后,用子类 student s = new student();创建一个对象s,s.age或者s.show调用方法时,默认先去student类中找有没有age属性和重写的show,没有的话就去直接父类,还没有就去间接父类中找
2. 调用父类的构造器
- super(参数):调用父类中的对应构造器(要写在构造器的函数体的第一行)。
- this(参数):调用本类中对应的构造器(要写在构造器的函数体的第一行)。
- 代码说明:
- ABCDE为缺省类型的构造器
- super(空/参数)或 this(空/参数)必须写在该构造器函数体的第一行
- 17行:其实可以不写,因为默认调用父类的空参构造器
- 33-34行:为cn重新构造
- 27行:相当于E构造器调用了D构造器,D中调用了父类的构造器
-
如果子类构造器中没写super,子类中所有的构造器默认都会访问父类中空参数的构造器(即用子类构造器实例化一个对象时,自动也会调用父类构造器)
-
当父类中没有空参数的构造器时,子类的构造器必须通过this(参数列表)或者super(参数列表)语句指定调用本类或者父类中相应的 构造器。同时,只能”二选一”,且必须放在构造器的首行
-
如果子类构造器中既未显式调用父类或本类的构造器,且父类中又没有无参的构造器,则编译出错
-
如果父类的构造器都是有参构造器,在子类的多个构造器中,至少有一个构造器函数体的第一行调用 super(参数);假如说子类只有构造器A调用了super,那么如果使用其他构造器都一定要在函数体中调用A构造器。也就是说子类的构造器一定会直接或间接调用父类的构造器
3. 子类对象的实例化过程
例如: Dog dog = new Dog(“小花”,“母”); 创建一个Dog类的对象dog时,子类的构造器一定会直接或间接调用父类的构造器,会把其所有直接间接父类的属性都加载进堆空间中。