class A{
public A(String s) {
System.out.println("A....");
}
}class B extends A {
public B(){
super("bbb..."); //a
}
}请问:a 处是显式调用父类的无参构造函数 还是有参构造函数??
如果是有参构造函数,为什么写在子类的无参构造函数中呢,这样的话,整体上,这个构造函数是有参的 还是无参的呢,
public A(String s) {
System.out.println("A....");
}
}class B extends A {
public B(){
super("bbb..."); //a
}
}请问:a 处是显式调用父类的无参构造函数 还是有参构造函数??
如果是有参构造函数,为什么写在子类的无参构造函数中呢,这样的话,整体上,这个构造函数是有参的 还是无参的呢,
---看你a处的代码: super("bbb..."); //a
其中super的参数"bbb..."就是传递给父类的构造函数的参数。 如果是有参构造函数,为什么写在子类的无参构造函数中呢,这样的话,整体上,这个构造函数是有参的 还是无参的呢,---- 子类的无参构造函数 有的时候需要调用父类的有参构造器进行一些初始化工作。
同时因为父类没有提供无参的构造器,所以子类必须在构造器里显式的调用父类的有参构造器。
整体上该构造器还是无参的,尽管他调用了父类的有参构造器。楼主可以去看一下thinking in java 上面说得很清楚。。
class A{
A(){}
}class B extends A{
B(){
//最前面默认有super(); 可以写,可以不写.没有写java会帮你加上,如果不存在A()的话,自然会出错了,要显式写明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