本人菜鸟,下边这个是关于继承的一个程序
class SuperClass{
  private int n;
    SuperClass(int n){
     System.out.println("SuperClass("+n+")");
     this.n=n;
       }
   }
 class SubClass extends SuperClass{
     private int n;
     SubClass(int  n){
       System.out.println("SubClass("+n+")");
         this.n=n;
    }
  SubClass(){
     super(300);
     System.out.println("SubClass()");
     }
}
public class TestInherit{
   public static void main(String args[]){
   SubClass sc1=new SubClass();
      }
}
为什么明明有SuperClass(int n)这个带参数的父类构造函数,可是子类子类中用super(300)这个的时候会出错呢?这个程序为什么运行不了???

解决方案 »

  1.   

    你把super(300) 放到子类无参的构造函数里看看 会不会报错。试了就明白了。
      

  2.   

    class SuperClass{
        private int n;
        SuperClass(int n){
            System.out.println("SuperClass("+n+")");
            this.n=n;
        }
    }
    class SubClass extends SuperClass{    SubClass(int n){
            super(n);
            System.out.println("SubClass("+n+")");
        }
        SubClass(){
            super(300);
            System.out.println("SubClass()");
        }
    }
    public class TestInherit{
        public static void main(String args[]){
            SubClass sc1=new SubClass();
        }
    }
      

  3.   

    你这个代码是编译不过去的,提示Implicit super constructor SuperClass() is undefined. Must explicitly invoke another constructor,所以你要让他知道invoke那个构造方法,修改如下
    class SubClass extends SuperClass {
    private int n; SubClass(int n) {
    super(100);
    System.out.println("SubClass(" + n + ")");
    this.n = n;
    } SubClass() {
    super(300);
    System.out.println("SubClass()");
    }
    }
      

  4.   

    解释:当构造方法不明确调用父类中的构造方法时,JVM默认是调用父类的无参构造。1、如上你的SubClass中第一个构造方法,未显示调用super,默认调用super(),因为父类不存在无参构造而报错;
    2、如上你的SubClass中第二个构造方法,因为显示调用super,及调用父类的有参数构造,所以就不会去调用默认的无参构造super(),所以不会报错。
    3、同理,如上SuperClass类中未显示调用super,也是调用Object类的无参构造。以上仅个人观点。
      

  5.   

    解释:当构造方法不明确调用父类中的构造方法时,JVM默认是调用父类的无参构造。1、如上你的SubClass中第一个构造方法,未显示调用super,默认调用super(),因为父类不存在无参构造而报错;
    2、如上你的SubClass中第二个构造方法,因为显示调用super,及调用父类的有参数构造,所以就不会去调用默认的无参构造super(),所以不会报错。
    3、同理,如上SuperClass类中未显示调用super,也是调用Object类的无参构造。以上仅个人观点。