class A
{
A(int a)
{
System.out.println("A.a = "+a);
}
}
class B extends A
{
B(){
super(3);
System.out.println("B()");
}
B(int a)
{
super(3);
System.out.println("B.a = "+a);
}
public static void main(String args[])
{
new B();
}
}A中没有定义A(){}
编译居然有时正确,有时出错。倒死了。
构造函数调用法则到底是怎么样的??

解决方案 »

  1.   

    这不能够通过吧,先调用A的无参构造方法,再调用B相应的构造方法...例如像基类Object类,只有一个无参的构造方法!
      

  2.   

    A中没有定义A(){} 是指A默认的构造函数,你定义了 A(int a)就是把A()这个默认函数算是一定意义上的覆盖,意思就没有A()了,所以下面你如果想调用A()的话 会出错误
      

  3.   

    class A
    {
        A(){}
        A(int a)
        {
            System.out.println("A.a = "+a);
        }
    }
      

  4.   

    编译器是不可能错的。! 而有可能你用的工具会提示错误,如果这样你就手动编译 javac 编译你这段代码没有问题。!
      

  5.   

    你在B类里new自己?这样恐怕不行吧……
      

  6.   

    你的例子里自己用super调用指定的构造方法了,再说A根本没有默认构造方法.
    如果你把B中的super(3);去掉就会出问题了,因为编译器会自动帮你添加super();这就需要A 有默认构造方法了.
      

  7.   

     程序本身没有问题,执行的过程大约如下:
    1、new B();
    2、调用类B的无参构造方法
      B(){
            super(3);        
            System.out.println("B()");            
        }
    3、由于B类中调用的super(3); 
    所以,调用父类的具有一个参数的构造方法。即:
    A(int a)
        {
            System.out.println("A.a = "+a);
        }
    4、说明:这样就没有访问到A类的无参构造方法。
    如果B类中无参构造方法中没有使用super(3); 或使用无参Super(),
    则默认调用A类中的无参构造方法,这时候就会报错。
      

  8.   

    代码有问题。
    因为B继承了A,在我的环境下会报A()未定义。
      

  9.   

    如果你自己手工加了一个 构造方法的话,那么这个类就不再有默认的构造方法。
    例如 
    class A
    {
        A(int a)
        {
            System.out.println("A.a = "+a);
        }
    }
    只有在 没有为其提供构造方法的时候 才会有默认构造方法之说 。
    所以 在本例中 
    class B extends A
    {
        B(){
            super(3);        
            System.out.println("B()");            
        }
        B(int a)
        {
            super(3);        
            System.out.println("B.a = "+a);
        }
        public static void main(String args[])
        {
            new B();
        }    
    }super(3);   是正确的 。 如果换成super()调用默认的构造方法就出错了
      

  10.   

    我运行没有问题,不知道楼主问题出在哪里运行结果:
    A.a = 3
    B()