我只知道super是调用父类构造函数和所指父类对象的,我估计是super不是这样用的,因为下面的程序只有一个输出结果class A{
int x;
public A(){
this.print() ;
}
public  void print(){
System.out.println("x="+x);
}

}
class B extends A{
private int x = 100 ;
public B(int x){
super();//这里我不super()调用父类无参构造函数了吗?无参构造函数里面不有print()方法吗?
this.x = x ;             //那为什么结果只有一个输出???代码没有错误!
}
/* public void print(){
System.out.println("x = " + x) ;
}*/
}
public class TestJava01{
public static void main(String args[]){
A a = new B(10) ;
}
}

解决方案 »

  1.   

    我怀疑是不是super()这个方法仅仅是根据super()的()中的参数不同来调用父类不同的构造方法的,不能调用与(父类构造函数中)参数无关的方法????????譬如这里父类构造函数中的print()方法
      

  2.   

    super就是执行父类的构造方法 你这程序就算不super它也会输出x=0 这跟父类的其他方法有什么关系?
      

  3.   

    在构造子类对象时,父类的构造方法只能被调用一次,如果你没有调用,编译器(还是JVM?)会自动给你调用父类的无参构造方法(也就是默认的构造方法),如果你调用了一个父类的任意一个构造方法,编译器就不会自动调用父类的无参构造方法了。如果父类的构造方法被调用了两次,那岂不是在子类对象中包含了两个父类对象了?super会指针那一个父类对象?一切都乱了。
      

  4.   

    还有一点要注意,构造方法中尽量不要调用非static方法,构造方法执行过程中,对象还没有完成初始化过程,非static方法如果访问了没有初始过的成员,会有意料之外的结果发生。
      

  5.   

    不写super系统会自动调用父类无参的构造函数
    所以有输出写了super是你自己手动调用的父类构造函数
    系统就不会再自动调用父类的构造函数了
      

  6.   

    肯定会输出一个结果,而且这个结果是父类A的X值,因为没有给父类的X赋值且SUPER()也没有给他传值,因此就输出X的默认值0
      

  7.   

    不管你是否手动调用super()还是让系统自动调用,输出的都是A类中的x.所以结果是0.
      

  8.   



    确实是啊,我的意思是我用super()调用了父类的构造函数,父类构造函数中有一个print()方法,为什么子类构造函数没有执行print()方法,就是没有输出???
      

  9.   

    我的意思就是:不管是不是手动调用父类无参构造函数,子类构造函数都调用父类无参构造函数,这都没有问题,关键是父类构造函数中有一个print()方法是吧????????????
    既然你子类调用了调用父类的无参构造函数,父类构造函数中有输出X的方法,那么子类为什么没有输出X的结果????????????
      

  10.   


    public B2(int x) {
    super();
    this.x = x; 
    this.print();//要不重写父类的方法,要不继承调用父类的方法。
    }
    public void print() {
    System.out.println("x = " + x); }
      

  11.   

    你这里用到了构造器多态了,你打印出来的结果应该是你 B类中的 print方法的结果。不过你这里貌似只可能有一个输出啊。 还有构造器中最好只调用本类的private方法
      

  12.   


    因为你的子类构造函数里没有调用 print() 方法.
    在执行 A a = new B(10) 这条语句的时候,会做这样一些事:
    1.调用 B 的构造函数 进入方法 B(int x).
    2.执行 B(int x) 里的 super() 语句,会去调用 A 类的构造函数 A(), 此时会调用 print() 方法一次。
    3.print() 结束后,再回到 B 的构造方法,继续执行下一条语句:this.x = x 。
    4.类 B 的一个实例构造完成。
    5.把类 B 的实例的引用 返回给类 A 的引用 a。整个过程只调用了一次 print() 方法,所以只有一次输出。