文章目录一、super 关键字1.1 super 是什么1.2 super 访问父类成员变量1.3 super 调用父类成员方法1.4 super 调用父类构造方法1.5 super 注意事项二、super 与 this 的区别2.1 概念对比2.2 调用构造方法的区别三、综合示例代码一、super 关键字1.1 super 是什么super作用在子类方法中访问父类成员访问父类的成员变量调用父类的成员方法调用父类的构造方法1.2 super 访问父类成员变量当子类定义了与父类同名的成员变量时此时可以通过super.变量名来访问父类的变量。publicclassAnimal{Stringname动物;}publicclassDogextendsAnimal{Stringname狗;publicvoidshow(){System.out.println(子类 name name);// 输出狗System.out.println(父类 name super.name);// 输出动物}}1.3 super 调用父类成员方法当子类重写Override父类的方法后如果还想调用父类被重写的方法可以使用super.方法名()。classAnimal{publicvoideat(){System.out.println(动物在吃东西);}}classDogextendsAnimal{Overridepublicvoideat(){super.eat();// 先调用父类的方法System.out.println(狗在啃骨头);}}1.4 super 调用父类构造方法super(参数列表)用于在子类构造方法中显式调用父类的构造方法。必须放在子类构造方法的第一行。classAnimal{publicAnimal(Stringname){System.out.println(父类构造方法name);}}classDogextendsAnimal{publicDog(Stringname){super(name);// 必须第一行System.out.println(子类构造方法);}}1.5 super 注意事项super不能出现在静态方法中因为静态方法属于类不依赖对象实例。super不能用于访问父类的私有成员private修饰的变量和方法。如果父类没有无参构造方法子类构造方法必须显式调用super(参数)否则编译报错。二、super 与 this 的区别2.1 概念对比对比superthis含义引用父类对象引用当前对象访问成员变量super.变量名访问父类成员this.变量名访问本类成员调用成员方法super.方法名()调用父类方法this.方法名()调用本类方法调用构造方法super(参数)调用父类构造方法this(参数)调用本类其他构造方法使用位置子类中本类中静态方法中使用不允许不允许2.2 调用构造方法的区别this(参数)调用本类的其他构造方法。super(参数)调用父类的构造方法。两者都必须放在构造方法的第一行因此不能同时出现。classPerson{publicPerson(){System.out.println(父类无参构造);}publicPerson(Stringname){System.out.println(父类有参构造name);}}classStudentextendsPerson{publicStudent(){this(张三);// 调用本类有参构造System.out.println(子类无参构造);}publicStudent(Stringname){super(name);// 调用父类有参构造System.out.println(子类有参构造);}}三、综合示例代码下面通过一个综合示例把 super 和 this 结合起来classBase{publicBase(){System.out.println(Base 构造方法);}publicBase(Stringmsg){System.out.println(Base 有参构造msg);}}classDerivedextendsBase{publicDerived(){this(默认);System.out.println(Derived 无参构造);}publicDerived(Stringmsg){super(msg);System.out.println(Derived 有参构造msg);}}publicclassMain{publicstaticvoidmain(String[]args){newDerived();}}输出结果Base 有参构造默认 Derived 有参构造默认 Derived 无参构造new Derived()触发子类无参构造Derived()Derived()第一行this(默认)→ 调用本类Derived(默认)进入Derived(String msg)第一行super(msg)→ 调用父类Base(默认)执行父类有参构造打印Base 有参构造默认回到子类有参构造继续往下执行打印Derived 有参构造默认回到子类无参构造执行this(默认)后面代码打印Derived 无参构造