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.父类如果写了有参构造但没写无参构造,子类所有的构造函数都必须手动调用父类的有参构造,否则报错
}
}