为什么这么程序不能运行?讲下下原理?
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);
}
}
------解决方案--------------------SubClass的父类没有显式地重写空的构造方法,同时还重新了int为参数的空的构造方法
所以SubClass调用super()这个空构造方法会编译报错
要么你显式重新空的构造方法,要么删掉其他的构造方法的重载,这样才能不会编译报错
------解决方案--------------------因为你把无参构造函数注释了……
如果你不显示声明构造函数的时候,编译器会为你默认加一个无参构造函数。而当你有了构造函数,就不会为你加了。。。。而你的子类却在构造函数里面调用了父类的无参构造函数,当然出错了啊
------解决方案--------------------这句出错了:super();
因为你把不带参数的那个构造方法注释掉了,把注释去掉就行了
------解决方案--------------------讲一下原理:
1、如果你不写构造方法时,系统会给你一个默认的不带参数的构造方法;
2、如果你写了构造方法时,系统就不会给你默认的构造方法了;
你的程序已经自己写了构造方法了,所以系统就不会给你默认的构造方法了,所以super()这个方法是没有不存在的,你要调用的话,需要自己写,也就是注释掉的那段代码
------解决方案--------------------
------解决方案--------------------因为子类构造函数执行之前必须先执行父类的构造函数……你依然没有
------解决方案--------------------super();调用的父类的默认构造方法,楼主可以用super(X)调用SuperClass(int n) 方法就可以了