A股上市公司传智教育(股票代码 003032)旗下技术交流社区北京昌平校区

 找回密码
 加入黑马

QQ登录

只需一步,快速开始

本帖最后由 周刚 于 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 子类时 不带参就会报错了!”

评分

参与人数 1技术分 +1 收起 理由
韦念欣 + 1 楼主好好总结一下哦,赞一个!

查看全部评分

2 个回复

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

评分

参与人数 1技术分 +1 收起 理由
韦念欣 + 1 赞一个!

查看全部评分

回复 使用道具 举报
补充,上面说的是   覆盖的前提,打错了
回复 使用道具 举报
您需要登录后才可以回帖 登录 | 加入黑马