class superclass{

superclass()
{
System.out.println("superclass");}
superclass(int n)
{
System.out.println("superclass int n");}
}
class subclass extends superclass{

subclass()
{
super(100);
System.out.println("subclass");}
subclass(int n)
{
System.out.println("subclass int n");}
}
public class sp{
public static void main(String[] args)
{
subclass x=new subclass();}
}
如果将基类中无参构造方法去掉 则会报错 但是我在子类无参构造方法中用了super 既然没有用到基类无参构造方法 为什么报错

解决方案 »

  1.   

    superclass(int n)
    {
    System.out.println("superclass int n");}
    因为上面的构造方法没有显示调用父类的有参构造方法,所以默认调用其无参构造方法(相当于有个:super()语句),但你的父类没有这个无参构造函数,所以报错。
    要想不报错,应该加上:super(n);
    superclass(int n)
    {
    super(n);  //加上这句。
    System.out.println("superclass int n");}
      

  2.   

    抱歉,上面的构造方法应该是:subclass(int n).
    subclass(int n)
    {
    System.out.println("superclass int n");}
    subclass(int n)
    {
    super(n);
    System.out.println("superclass int n");}
      

  3.   

    System.out.println("superclass int n"); 应为:System.out.println("subclass int n");
      

  4.   

    lz你在subclass的有参构造函数的第一句加上super(n)就可以解决,我推测java命令在编译java源程序时会检测每个子类的构造函数是否隐式或显示调用父类的构造方法。
      

  5.   

    为什么我在MyEclipse把基类的无参构造函数去掉后运行这个程序,虽然有错误显示,但是还是能运行,且能输出结果
      

  6.   

    你如果去掉父类的无参构造器。
    你的子类有参函数
    subclass(int n)
    {
    System.out.println("subclass int n");}
    在这里没有指明构造函数,就会使用默认构造函数(即无参构造器),虽然你没用这个构造函数实例化子类对象,你也给父类提供了有参构造函数用于实例化。不过在编译的时候,我估计处于安全考虑,编译程序会排查每个子类的构造函数是否隐式或显示调用的父类构造函数。
      

  7.   

    也就是说在eclipse中这是安全警告,不影响程序运行.
      

  8.   

    也就是说在eclipse中是安全警告,不影响程序执行。
      

  9.   

    但是eclipse上面显示的是错误的标志啊,我现在在eclipse上面碰到的只要是显示错误的标志的程序都运行不了,这个却能够运行,是什么个回事?
      

  10.   

    确实,在dos下编译错误,也无法执行,因为编译器只为我生成了superclass.class文件,不晓得你在eclipse中为啥能执行,不过你的错误确实是没指定构造函数。
      

  11.   

    如果没有构造方法,虚拟机会默认一个无参构造方法
    如果有构造方法,无论是有参的还是无参的,就不会有默认的无参构造方法
    在这里你重写了父类的有参构造方法,却又调用父类的有参构造方法,所以报错
    lz可以讲子类的有参构造方法去掉,或者将super(100);改成new subclass(100);