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

 找回密码
 加入黑马

QQ登录

只需一步,快速开始

© 王德南 中级黑马   /  2012-4-14 23:24  /  2489 人查看  /  6 人回复  /   0 人收藏 转载请遵从CC协议 禁止商业使用本文

下面的代码中,为什么调用的是子类的构造函数,它首先调用它父类的构造函数,最后才调用自己的呢?
  1. class A
  2. A(){
  3. System.out.println("A的构造函数");
  4. }
  5. }
  6. class B extends A{
  7. B(){
  8. System.out.println("B的构造函数");
  9. }
  10. }
  11. class C extends B{
  12. C(){
  13. System.out.println("C的构造函数");
  14. }
  15. }
  16. class Test{
  17. Public static void main(Sting args[]){
  18. C c=new C();
  19. }
  20. }
复制代码

评分

参与人数 1技术分 +1 收起 理由
贠(yun)靖 + 1

查看全部评分

6 个回复

倒序浏览
本帖最后由 陈志伟 于 2012-4-14 23:39 编辑

1.如果子类没有定义构造方法,则调用父类的无参数的构造方法。
2.如果子类定义了构造方法,不论是无参数还是带参数,在创建子类的对象的时候,首先执行父类无参数的构造方法,然后执行自己的构造方法。
3.如果子类调用父类带参数的构造方法,可以通过super(参数)调用所需要的父类的构造方法,切该语句做为子类构造方法中的第一条语句。
4.如果某个构造方法调用类中的其他的构造方法,则可以用this(参数),切该语句放在构造方法的第一条。
说白了:原则就是,先调用父亲的。(没有就默认调,有了就按有的调,反正只要有一个就可以了。)
因此,你的结果会先输出“A的构造函数”,再次是“B的构造函数”,最后“C的构造函数”。

评分

参与人数 1技术分 +1 收起 理由
贠(yun)靖 + 1

查看全部评分

回复 使用道具 举报
在一个类层次中,构造函数按派生类顺序,即从超类到子类的顺序被调用。还有,因为超类不知道任何子类的信息,任何它要执行的初始化可能和子类执行的初始化时分离的,而且是子类执行初始化的先决条件,因此先执行超类的

评分

参与人数 1技术分 +1 收起 理由
贠(yun)靖 + 1

查看全部评分

回复 使用道具 举报
本帖最后由 曾虓 于 2012-4-14 23:50 编辑

继承和初始化的问题。
以你这个例子为例,编译器先启动找到C类的编译代码,对它进行加载过程中,注意到它有一个基类B,于是编译器会加载基类B,紧接着会加载基类A.
所有必要类加载完毕后,对象开始创建了。首先是对象所有的基本类型都会被设为默认值,对象引用设为null,然后基类的构造器才会被调用,然后才会是子类的构造器调用。

所以楼主搞错了一点,加载类确实是从C类开始的,但是加载完后,建立对象却是从基类的构造器开始调用的。

评分

参与人数 1技术分 +1 收起 理由
贠(yun)靖 + 1

查看全部评分

回复 使用道具 举报

class A {
        A() {
                // super()
                System.out.println("A的构造函数");
        }
}

class B extends A {
        B() {
                // super()
                System.out.println("B的构造函数");
        }
}

class C extends B {
        C() {
                // super()
                System.out.println("C的构造函数");
        }
}

public class Test {
        public static void main(String args[]) {
                C c = new C();
        }
}

在没个子类中,没个子类的构造函数都默认有一个super()来掉用父类无参的构造方法,class A 的构造方法中也默认有super(),它是调用老祖宗Object的构造方法

评分

参与人数 1技术分 +1 收起 理由
贠(yun)靖 + 1

查看全部评分

回复 使用道具 举报
楼上正解,在子类方法中会有一个隐式的super();
回复 使用道具 举报
子类中会有super();调用父类的无参构造函数,默认不显示,如果加上就是下面这样子

class A

A(){

System.out.println("A的构造函数");

}

}

class B extends A{

B(){
super();
System.out.println("B的构造函数");

}

}

class C extends B{

C(){
super();
System.out.println("C的构造函数");

}

}

class Test{

Public static void main(Sting args[]){

C c=new C();

}

}
回复 使用道具 举报
您需要登录后才可以回帖 登录 | 加入黑马