本帖最后由 yl6493888 于 2011-04-12 21:32:22 编辑

解决方案 »

  1.   

    第一:子类的构造过程中必须调用其基类的构造方法
     第二:如果子类的构造方法中没有显示地调用基类的构造方法,则系统默认调用基类
     无参数的构造方法
     第三:如果子类构造方法中既没有显式调用基类的构造方法,而基类中有没有无参数的构造方法,则编译出错
    package mashibing;
     public class TextSupSub {
     /**
     * @param args
     */
     public static void main(String[] args) {
     // TODO Auto-generated method stub
     SubClass sc1 = new SubClass();
     SubClass sc2 = new SubClass(400);
     }
     }
     class SuperClass {
     private int n;
     
    SuperClass() {
     System.out.println("SuperClass()");
     this.n = n;
     }
     
    SuperClass(int n) {
     System.out.println("SuperClass("+n+")");
     }
     
    }
     class SubClass extends SuperClass {
     private int n;
     
    SubClass(int n) {
     System.out.println("SubClass("+n+")");
     }
     
    SubClass() {
     super(300);//必须写到第一句
     System.out.println("SubClass()");
     
    }
    }
     
    首先看这个程序main中的SubClass sc1 = new SubClass();很显然其调用了子类SubClass中的SubClass()方法,
     注意该方法的第一句就调用了父类SupClass的SupClass(int n)方法;这一点很好理解。但如果把super(300)给注释掉或者去掉,此时运行的结果第一句就是SuperClass(),也就是符合第二条规则。其实此时子类的 
    SubClass() {
     super(300);//把这一句去掉
     System.out.println("SubClass()");
     
    }就相当于
     SubClass() {
     super();//调用了基类中无参数的构造方法
     System.out.println("SubClass()");
     
    } 如果去掉此句的同时把基类的SupClass()也给去掉,则就符合第三条规则了,运行一定出错。
     同理分析可知子类中的这一方法: 
    SubClass(int n) {
     System.out.println("SubClass("+n+")");
     }
     
    就等同于
     
    SubClass(int n) {
     SupClss();
     System.out.println("SubClass("+n+")");
     }
     另外还有一个有意思的现象就是当把
     SuperClass() {
     System.out.println("SuperClass()");
     }
     此句给去掉时子类中(就本程序而言)的SubClss(int n)方法肯定会报错,因为系统在父类中找不到没有参数的构造方法,
     如果在该方法的第一句写super(n);(n代表一个整数)就不会错了。
    也就是说:如果父类中没有无参数的构造方法,而且子类的构造方法中没有调用父类的其他(有参数的方法,那么就出错了)结合第三条不难理解
      

  2.   

    new一个对象就是要执行这个类的构造方法,然后向上寻找它父类的构造方法,在B类的父类A中 有构造方法A() {print("A()");}也就是调用了protected void print(String s) {System.out.println(s);}这个方法
      

  3.   

    A() {print("A()");}这句话我看视频里面说会是传递了参数给 protected void print(String s) {
    System.out.println(s);才会输出A(),怎么会传递呢