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 extends SuperClass ,所以在用SubClass new 对象的时候需要用super new父类的对象,但是在
class ThisClass{
private int age;
private String name;
ThisClass(int _age,String _name){
this.age=_age;
this.name=_name;
System.out.println(name+"is"+age);
}

}

public class ThisPro extends ThisClass{
public static void main(String[] args){
ThisClass new1=new ThisClass(12,"xiaohong");
ThisClass new2=new ThisClass(25,"xiaoliang");

}

}
中直接用父类ThisClass new对象,为什么还要在ThisPro里面写super new父类对象呢???

解决方案 »

  1.   

    super 用来调用父类的构造函数
      

  2.   

    调用父类构造函数,使用super关键字。另外,还有必要的参数。
      

  3.   

    调不调父类构造方法并不是语法上强制的,也就是说没人规定你必须要在子类里写super(),只不过从逻辑语义上来说,子类不应该弱化父类的行为,所以在子类的构造方法里有义务去掉父类的构造方法,已使得new出来的子类对象被转型为父类对象时一样能够正常使用
      

  4.   

    这个说对了,如果不显式声明构造函数,系统会创建一个默认的构造函数,该构造函数是没有参数的
    比如
    class A {
        ///
    }class Test {
        public static void main(String[] args) {
            A a = new A(); //A没有显式声明构造函数,所以系统创建一个默认的无参数的构造函数,
                              //所以可以new A();
        }
    }当显式声明构造函数是,系统就不会再创建默认的无参的构造函数,比如
    class A {
        public A(int a) {}
    }class Test {
        public static void main(String[] args) {
            A a = new A(); //A显式声明构造函数,所以系统不会创建一个默认的无参数的构造函数,
                              //所以不可以new A();必须调用显式的构造函数new A(10);带个参数
        }
    }
    //同样的,子类也必须要显式调用父类有参数的构造函数
    class B extens A {
        public B() {} //这样是不行的,因为没有A没有默认的构造函数,
                         /所以父类内存没法创建,B对象也就不能创建    public B() {super(10);} //这样是可以的,因为子类显式调用父类构造函数,
                                   //父类内存可以创建,所以B对象就能创建
    }