第一个程序:class A extends B{
public A(){
super(1,2);
System.out.println("bbb");

}
public static void main(String args[]){
A a=new A();

}
}
class B{
public B(){
System.out.println("B");
}
public B(int x,int y){
System.out.println("aaa");
}

}输出结果是:aaa
            bbb
第二个程序:class A extends B{
public A(){
//super(1,2);
System.out.println("bbb");

}
public static void main(String args[]){
A a=new A();

}
}
class B{
public B(){
System.out.println("B");
}
//public B(int x,int y){
//System.out.println("aaa");
//}

}输出结果是:
B
bbb代码写的不好,只是有点不懂!
1.在main方法中调用子类的构造方法,应该先调用父类的构造方法,所以在第一个程序,应该先调用父类的方法,第一个输出的是B,但是,却输出了aaa
2.在第二个程序中,第一个输出的是B(先调用父类的构造方法)
请高手讲解一下!谢谢!

解决方案 »

  1.   

    确实子类new的时候会先调用父类的构造方法。你也写的很明白。如1父类有多个(2个)构造函数你说调用那一个?默认调用无参的,super用来指定调用哪一个父类构造函数。
      

  2.   

    1 A构造的时候显示调用B的构造 故bbb2 A构造的时候没有指定则调用B的默认构造
      

  3.   

    因为你的父类构造函数有重载啊,super(1,2); 根据参数列表就能知道要调用
     public B(int x,int y){
            System.out.println("aaa");
        }
    这个构造函数
      

  4.   

    第一个程序:  super(1,2); 显示调用B的 public B(int x,int y) 构造第二个程序:  隐式调用B的默认构造public B()
      

  5.   

    楼主的问题应该是.如果先调用父类构造方法,那么A a=new A();是没有参数的,
    应该先调用 无参构造方法.但是结果调用的 有参数的构造方法.
    是不是因为先调用了A本身的构造方法,才去调用父类有参的构造方法呢?确实是这样,A a=new A();以后,虚拟机会首先去检查A的构造方法中,有没有super关键字
    如果没有再去调用父类构造方法,如果有就先执行super里面的内容
    这也是为什么super一定要写在first的原因
      

  6.   

    这个例子是纯粹的让人了解构造函数是什么时候调用的。即构造函数是实例化的时候调用的。
    我在给大家一个public class Base {
    public int i =1;
    public void amethods(){

    System.out.println("Base.amethod()");
    }
    Base(){
    amethods();
    }}public class Descend extends Base{
    public int i=-1;
    int d=0;
    public static void main(String[] args) {
    Base b = new Descend();
    System.out.println(b.i);
    b.amethods();

    }
    public void amethods(){

    System.out.println("Descend.amenthod()");
    }}
    大家可以运行一下 答案是
    Descend.amenthod()
    1
    Descend.amenthod()
      

  7.   

    一个对象只能由一个构造方法new 很明显你的调用的是有参构造方法,并非无参构造方法
      

  8.   

    构造器有重载的,你的super.B(..)指定了哪个构造器,如果指定的构造器有参,则实例化的时候是有有参的,若不写,默认实例化无参的构造器方法。
      

  9.   

    第一个程序:因为  super(1,2)传的是两个参数,就会调用父类有两个参数的构造方法,如果是这样super()就会调用没有参数的构造方法.
    第二个程序:因为你继承了父类,在调用子类构造方法之前,先会隐示的调用父类没有参数的构造方法,然后再调用子类的构造方法
      

  10.   

    楼主的第二段代码,我不明白,为什么会输出B,不是没有去调用类B的默认构造方法吗?怎么会输出B?