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()的,这是还找不着父类的无参构造方法就会报错。
一只萌萌小番薯
TA贡献1795条经验 获得超7个赞
在一个类的构造方法里,必须调用父类的构造方法,如果没有显式的调用,java会自动调用“默认构造方法”,也就是一个没有任何参数的构造方法,但是SuperClass没有默认构造方法,所以自然报错
如果将父类所有的构造方法去掉,java将会自动生成一个默认构造方法,一旦自己写了任何一个构造方法,java就不会再生成
在上面的例子里,如果你把SuperClass的所有构造方法去掉,在SubClass的构造方法里直接调用super();就不会报错
添加回答
举报
0/150
提交
取消