日期:2014-05-20  浏览次数:20663 次

为什么这么程序不能运行?讲下下原理?
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()这个方法是没有不存在的,你要调用的话,需要自己写,也就是注释掉的那段代码
------解决方案--------------------
探讨

讲一下原理:
1、如果你不写构造方法时,系统会给你一个默认的不带参数的构造方法;
2、如果你写了构造方法时,系统就不会给你默认的构造方法了;

你的程序已经自己写了构造方法了,所以系统就不会给你默认的构造方法了,所以super()这个方法是没有不存在的,你要调用的话,需要自己写,也就是注释掉的那段代码

------解决方案--------------------
因为子类构造函数执行之前必须先执行父类的构造函数……你依然没有
------解决方案--------------------
super();调用的父类的默认构造方法,楼主可以用super(X)调用SuperClass(int n) 方法就可以了