super 关键字

super 是 java 中的一个关键字,super 代表了当前对象中从父类继承过来的那部分特征。

this的用法:构造方法、this 关键字 - 鹿先森JIAN - 博客园 (cnblogs.com)

下面通过对比 this 来学习 super

this:指当前对象
     this 在非静态方法中使用,谁调用这个方法,this就是这个对象!
     
super:指父类特征
      super 在子类的非静态方法中使用,指向父类的属性和方法!
      
  public void fun(){
    System.out.println(this);
     //System.out.println(super);错误的,super不是对象不能直接输出
  }      
---------------------------------------------------
this 使用场景:
     1.默认使用
     2.有参构造对属性初始化,this.属性=属性
       set方法,this.属性=属性
       区分成员变量和局部变量,this不可省略!
   3.构造函数之间相互调用使用this(【实参】); 必须放首行 --------------------------------------------------- super 使用场景: 1.默认使用 2.super.父类方法() 如果在重写的方法中调用父类的方法,super不可省略 3.子类调用父类构造函数 super(【实参】); 必须放首行 子类所有的构造函数都默认地隐式地调用父类的无参构造 this()和super()不能在同一个构造函数中使用! 4.父类如果写了有参构造但不写无参构造,子类所有的构造函数都必须手动调用父类的有参构造,否则会报错

下面,针对 super 使用场景来举例:

  举例一:默认使用、必须放在第一行

public class A {
    public A(){
     //super();  //默认调用了Object类中的无参构造方法,可不写 System.out.println(
"A类的无参构造方法"); } } //----------------------------------------------------- public class B extends A { public B(){
     //super();  //默认调用了父类A 的无参构造,可不写 System.out.println(
"B类的无参构造方法"); } } //-------------------------------------------- public class C extends B { public C(){
     //super();  //默认调用了父类B 的无参构造,可不写 System.out.println(
"C类的无参构造方法"); } } //------------------------------------------- public class Test{ public static void main(String[] args) { C c = new C(); } } 执行结果: A类的无参构造方法 B类的无参构造方法 C类的无参构造方法

 注意:如果父类写了有参构造,最好也写一下无参构造

 

报错原因:由于父类 A 写了有参构造方法,导致无参构造方法不存在,从而编译报错了。所以在实际开发中还是建议程序员将无参构造方法写出来,这样就可以避免对象的创建失败了。

解决方法:在父类里写个无参构造,或者在子类构造函数里手动调用父类的有参构造(如下)

public class B extends A {
  public B() {
    super("aaa");  //4.父类如果写了有参构造但没写无参构造,子类所有的构造函数都必须手动调用父类的有参构造,否则报错
  }
}

 

posted @ 2022-03-18 18:41  鹿先森JIAN  阅读(63)  评论(0编辑  收藏  举报