黑马程序员技术交流社区

标题: 关于子类必须会调用父类无参构件函数的一个发现 [打印本页]

作者: 周刚    时间: 2012-7-4 22:15
标题: 关于子类必须会调用父类无参构件函数的一个发现
本帖最后由 周刚 于 2012-7-4 22:31 编辑

回答朋友提问的时候发现了一个很基础,却以前始终理解错误的问题:
class A {
public A() {
  System.out.println("hello,I'm empty constructor in class A!");
}
public A(int num) {
  System.out.println("hello,I 'm Constructor with num=" + num + "  as parameter in class A");
}
}
public class B extends A {
public B(int num) {
  System.out.println("hello,I'm Constructor with num=" + num+" as parameter in class B!");
}
public static void main(String[] args) {
  B b = new B(5);
}
}
上面代码,B中的构造方法覆盖了父类中的带参数的构造方法。之前我以为子类用带参数的构造函数创建对象时会先调用父类
中带参数的构造方法,但事实上我错了:不会调用父类中带参数的构造方法,还是会调用父类中无参数
的构造方法!!!!!!这对我来说是个很大的意外,记录在这里,同时分享给不知道的朋友。
网上找到下面一段描述:
“这是一种规范! 当你没有编写 构造函数时,会默认一个 无参的构造函数! 当你编写带参的构造函数时! 就没有默认了! 所以 必须显示的编写! 而且当你new 子类时! 编译器 也是先进入父类的无参构造函数!    子类 无参 构造函数你可以注释掉! 但是当你再 main 里面 new 子类时 不带参就会报错了!”

作者: 金龙    时间: 2012-7-4 23:01
呃……朋友,我再和你说一个细节吧,首先,子类的构造方法绝对不会覆盖父类的构造方法。构造的前提是:方法的声明一模一样。子类和父类的构造方法名字必然不同(构造名与类名重载,所以不可能相同)。而子类在要初始化之前,一定会调用父类的构造方法去看父类是如何初始化的,所以,在子类的每一个构造方法中的第一行,都会有一个隐示的
super(),当然,如果你手动去写上去,系统就不会给你添加默认的,如上面你发的代码,如果你在子类的带参构造中第一行写一句super(num);那么,子类在创建的时候调用的就是父类带参的构造了,你可以试试
作者: 金龙    时间: 2012-7-4 23:02
补充,上面说的是   覆盖的前提,打错了




欢迎光临 黑马程序员技术交流社区 (http://bbs.itheima.com/) 黑马程序员IT技术论坛 X3.2