请问这里为什么一定要实现
A()构造函数啊??
package Reuse;class A{String sa;// A(){
// System.out.println("A()");
// }A(String s){
this.sa = s;
System.out.println("A(s)");
}
}class B{
String sb;B(){
System.out.println("B()");
}B(String s){
sb = s;
System.out.println("B(s)");
}
}public class C extends A{B b;C(B b){
this.b = b;
System.out.println("C(b)");
}public static void main(String[] args){
B b =new B();
C c =new C(b);
}}

解决方案 »

  1.   

    C是A的子类  C c =new C(b);调用C的构造函数  必须先调用其父类的构造函数 所以。
      

  2.   

    A(B b){

    }

    为什么这样不行?
      

  3.   

    因为子类的构造函数第一步要执行父类构造函数,如果父类存在无参构造函数则默认隐性执行,如果没有,像你的例子,需要指明父类构造函数的重载
    所以你可以写一个父类A的无参构造函数,或者在子类C的构造函数第一行显性调用父类构造函数的某个重载
    比如说super("");
      

  4.   

    一个类中如果有定义过构造函数,那么java提供的默认构造函数就取消了。
    所以A类中只有一个参数是String的构造函数。子类在初始化时,如果不显示的调用父类的构造函数,那么默认掉用父类的默认构造函数。
    父类A中没有默认构造函数,所以发生编译错误。Good Luck.
      

  5.   

    在这个得基础上子类C在实例化的时候就会去调用父类A的无参构造函数(A())。本来系统是自己创建无参构造函数的,但是:假如父类有带参数的构造函数,那么系统将不会给它创建无参数的构造函数。所以需要自己加上无参构造函数。
      

  6.   

    class A { String sa; // A(){
    // System.out.println("A()");
    // } A(String s) {
    this.sa = s;
    System.out.println("A(s)");
    }

    A(B b){

    }
    }class B {
    String sb; B() {
    System.out.println("B()");
    } B(String s) {
    sb = s;
    System.out.println("B(s)");
    }
    }public class C extends A { B b; C(B b) {
    super(b);
    this.b = b;
    System.out.println("C(b)");
    } public static void main(String[] args) {
    B b = new B();
    C c = new C(b);
    }}
    这样就好了。
      

  7.   

    其实这里主要有三点:
    1,如果一个类里面没有构造函数,则系统会说:“既然没有构造函数,那我就来造一人吧”,所以会有一个默认的构造函数,如果开发者自己在类中写了一个构造函数,则系统会说:“既然你已经有构造函数了,那就不需要我造一个函数了。”所以就不会有默认的构造函数。
    2,子类在初始化的时候,先调用父类的构造函数,再调用子类自己的构造函数。你的问题就出在这里,子类的构造函数里没有默认的构造函数可以调用 ,也没有在子类中显示的调用某个函数,比如super("");所以编译出错。
    3,初学者不要看这么复杂的代码。掌握知识点,要用简单的示例,你那个例子搞七搞八的,不怎么好讲知识点。呵呵。