日期:2014-05-20  浏览次数:20612 次

关于java中 子类显式调用父类的构造函数问题,请大家帮忙看看...
class A{
  public A(String s) {
  System.out.println("A....");
  }
}

class B extends A {
  public B(){
  super("bbb..."); //a
  }
}

请问:a 处是显式调用父类的无参构造函数 还是有参构造函数??
  如果是有参构造函数,为什么写在子类的无参构造函数中呢,这样的话,整体上,这个构造函数是有参的 还是无参的呢,

------解决方案--------------------
a 处是显式调用父类的无参构造函数 还是有参构造函数??
---看你a处的代码: super("bbb..."); //a
其中super的参数"bbb..."就是传递给父类的构造函数的参数。

 如果是有参构造函数,为什么写在子类的无参构造函数中呢,这样的话,整体上,这个构造函数是有参的 还是无参的呢,

---- 子类的无参构造函数 有的时候需要调用父类的有参构造器进行一些初始化工作。
同时因为父类没有提供无参的构造器,所以子类必须在构造器里显式的调用父类的有参构造器。
整体上该构造器还是无参的,尽管他调用了父类的有参构造器。

楼主可以去看一下thinking in java 上面说得很清楚。。
------解决方案--------------------
Java code

class A{
  A(){}
}

class B extends A{
   B(){
       //最前面默认有super(); 可以写,可以不写.没有写java会帮你加上,如果不存在A()的话,自然会出错了,要显式写明super(参数)
    }
}

------解决方案--------------------
? 子类必须使用super调用父类中构造方法,如果父类中含有无参的构造方法可以使用隐式调用,如果父类中不包含无参的构造方法的时候我们必须显示的调用有参的构造方法。
------解决方案--------------------

因为你给类A重载了构造器,因此原本类A的无参构造器就已经不存在了,只能下public A(String){}。因此,你无法再调用类A无参构造器。另外,对于楼主的第二个问题,因为类B是类A的子类,当创建类B时候,JVM会自动创建其父类,直至Object。类B的构造器是可以调用类A的有参构造器的,其实这个不管类B的构造器是有参还是无参的,对于调用类A的哪个构造器,可以由程序员自己指定,前提是你调用的类的构造器存在!

------解决方案--------------------
子类默认调用父类无参的构造方法
假如父类没有无参的构造方法那子类只能显示的调用父类的有参的构造方法了
------解决方案--------------------
当然是调用了父类的带参数构造函数。关于构造函数可以参考一下这里:
http://blog.csdn.net/yidinghe/archive/2009/01/21/3839483.aspx