java关键字——super

——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,没有的话就去直接父类,还没有就去间接父类中找

java关键字——super

 

 

2. 调用父类的构造器

  • super(参数):调用父类中的对应构造器(要写在构造器的函数体的第一行)。
  • this(参数):调用本类中对应的构造器(要写在构造器的函数体的第一行)。

java关键字——super                      java关键字——super                  java关键字——super

  • 代码说明:
  •  
  • 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时,子类的构造器一定会直接或间接调用父类的构造器,会把其所有直接间接父类的属性都加载进堆空间中。