为了账号安全,请及时绑定邮箱和手机立即绑定

如下显示,关于 Super关键字,继承的问题!求详细解答?

如下显示,关于 Super关键字,继承的问题!求详细解答?

守着星空守着你 2021-05-17 18:10:07
class SuperClass {private int n;/*SuperClass() {System.out.println("SuperClass()");}*/SuperClass(int n) {System.out.println("SuperClass(" + n + ")");this.n = n;} }class SubClass extends SuperClass {private int n;SubClass(int n) {//super();System.out.println("SubClass(" + n + ")");this.n = n;}SubClass() {super(300);System.out.println("SubClass()");}}public class TestSuperSub {public static void main(String arg[]) {SubClass sc1 = new SubClass();//SubClass sc2 = new SubClass(400);}}在执行main的第一句 SubClass sc1 = new SubClass();时,应该调用的是SubClass() {super(300);System.out.println("SubClass()");}这个构造方法,此方法内有个super(300);应该调用的是父类的重载的第二个方法SuperClass(int n) {System.out.println("SuperClass(" + n + ")");this.n = n;} 为什么,我注释了 父类的第一个方法,它就不能运行了?我感觉没有用到父类的第一个方法啊! //SubClass sc2 = new SubClass(400); 这个是main的第二句,我注释了,没执行,所以跟这句没关系!求老师或者大师解答下!谢谢……
查看完整描述

2 回答

?
小唯快跑啊

TA贡献1863条经验 获得超2个赞

问题在 SubClass(int n);

子类实例实际上是依赖父类存在的,你已经有一个重载的构造方法了,父类不写SuperClass()的话,那么父类就没有SuperClass()这个默认无参构造了。
你在调用子类构造方法时的时候不写super(),虚拟机会默认调用super()的,这是还找不着父类的无参构造方法就会报错。

查看完整回答
反对 回复 2021-05-23
?
一只萌萌小番薯

TA贡献1795条经验 获得超7个赞

在一个类的构造方法里,必须调用父类的构造方法,如果没有显式的调用,java会自动调用“默认构造方法”,也就是一个没有任何参数的构造方法,但是SuperClass没有默认构造方法,所以自然报错

如果将父类所有的构造方法去掉,java将会自动生成一个默认构造方法,一旦自己写了任何一个构造方法,java就不会再生成

在上面的例子里,如果你把SuperClass的所有构造方法去掉,在SubClass的构造方法里直接调用super();就不会报错

查看完整回答
反对 回复 2021-05-23
  • 2 回答
  • 0 关注
  • 127 浏览

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信